如果您想了解在非Qt应用程序中使用基于Qt的DLL的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于1、Qt应用程序、c–在Qt应用程序中获取命令行参数、c–在x86应用程序中使用x64dl
如果您想了解在非Qt应用程序中使用基于Qt的DLL的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于1、Qt应用程序、c – 在Qt应用程序中获取命令行参数、c – 在x86应用程序中使用x64 dll、c – 跨平台Qt应用程序中的全局热键的有价值的信息。
本文目录一览:在非Qt应用程序中使用基于Qt的DLL
我的一个客户有一个组织,我正在开发基于Qt的客户端 – 服务器的东西与很多有趣的小部件和套接字。
公司内部的另一个组织希望使用基于QTcpsocket的客户端数据提供程序类的封装版本。 (基本上是什么听起来像,从服务器提供数据到客户端显示)
但是,该组织主要使用MFC来构建一个巨大的应用程序,而且不久以后就不会有任何改变。基于Qt的DLL也是延迟加载,以便在某些配置中可以部署该功能。
我已经开始工作了,但这有点麻烦。这是我现在的解决方案:
DLL包装器类构造函数调用QCoreApplication :: instance()来查看它是否为NULL。如果它为NULL,它假定它在一个非Qt应用程序中,并创建一个自己的QCoreApplication实例:
if (QCoreApplication::instance() == NULL) { int argc = 1; char* argv[] = { "dummy.exe",NULL }; d->_app = new QCoreApplication(argc,argv); // safe? } else d->_app = NULL;
然后它将设置一个Windows计时器偶尔调用processEvents():
if (eventTimerInterval > 0) { // STATE: start a timer to occasionally process the Qt events in the event queue SetTimer(NULL,(UINT_PTR)this,eventTimerInterval,CDatabaseLayer_TimerCallback); }
回调简单地使用timerID作为指向类实例的指针调用processEvents()函数。 SetTimer()文档说HWND为NULL时,它会忽略timerID,因此这似乎是完全有效的。
VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { ((BLAHBLAH*)idEvent)->processEvents(); // basically just calls d->_app->processEvents(); }
然后我将摧毁QCoreApplication实例作为析构函数中的最后一件事。
BLAHBLAH::~BLAHBLAH() { .. other stuff QCoreApplication* app = d->_app; d->_app = NULL; delete d; if (app != NULL) delete app; }
如果主机应用程序希望对processEvents()本身进行调用,则可以在eventTimerInterval中传递0,并调用BLAHBLAH :: processEvents()本身。
有什么想法吗?将该应用移植到Qt是不可选的。这不是我们的
它似乎工作,但可能有几个假设在这里被打破。我可以用这样的虚拟参数构造QCoreApplication吗?事件队列是否能够以这种方式运行?
我不想让我以后再吹起来。思考?
我有一个全局命名空间:
// Private Qt application namespace QAppPriv { static int argc = 1; static char * argv[] = {"sharedlib.app",NULL}; static QCoreApplication * pApp = NULL; static QThread * pThread = NULL; };
我在一个QObject(这是moc’ed)中有一个OpenApp方法,如下所示:
// Initialize the app if (QAppPriv::pThread == NULL) { // Separate thread for application thread QAppPriv::pThread = new QThread(); // Direct connection is mandatory connect(QAppPriv::pThread,SIGNAL(started()),this,SLOT(OnExec()),Qt::DirectConnection); QAppPriv::pThread->start(); }
这里是OnExec插槽:
if (QCoreApplication::instance() == NULL) { QAppPriv::pApp = new QCoreApplication(QAppPriv::argc,QAppPriv::argv); QAppPriv::pApp->exec(); if (QAppPriv::pApp) delete QAppPriv::pApp; }
到目前为止,它似乎工作正常,我不知道如果我需要删除的应用程序在最后,如果我找到一些东西,我会更新我的答案。
1、Qt应用程序
新建Qt Widgets Application,基类选择QWidget
Qt项目特点(参考上图):头文件名与类名一样,成对出现
main.cpp代码解释如下
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
//只有一个应用程序对象
QApplication a(argc, argv);
MyWidget w;//MyWidget继承自QWidget(头文件中可以看出)
w.show();
return a.exec();//程序一直运行,等待事件发生
}
头文件如下
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT //信号与槽的时候需要
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
};
#endif // MYWIDGET_H
项目文件pro如下
#模块
QT += core gui
#高于4版本,添加QT += widgets。为了兼容Qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
#应用程序的名字
TARGET = Demo520
#生成的类型,如app(应用程序)、lib(库文件)
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
#源文件
SOURCES += \
main.cpp \
mywidget.cpp
#头文件
HEADERS += \
mywidget.h
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
c – 在Qt应用程序中获取命令行参数
因此,我可以解析命令行参数,以便知道运行哪种模式.
[编辑]
我正在使用Ubuntu Karmic上的Qt Creator 1.3.1进行调试.参数以正常方式传递(即通过Qt Creator IDE中的“项目”设置添加参数).
当我运行应用程序时,似乎没有将参数传递给应用程序.下面的代码是我的main()函数的代码段.
int main(int argc,char *argv[]){ //Q_INIT_RESOURCE(application); try { QApplication the_app(argc,argv); //trying to get the arguments into a list QStringList cmdline_args = QCoreApplication::arguments(); // Code continues ... } catch (const MyCustomException &e) { return 1; } return 0;}
[更新]
我已经确定了这个问题 – 由于某些原因,尽管argc是正确的,但argv的元素是空字符串.
我把这个小代码片段打印出来,可以看出它们都是空的.
for (int i=0; i< argc; i++){ std::string s(argv[i]); //required so I can see the damn variable in the debugger std::cout << s << std::endl;}
有没有人知道如何在我的应用程序中检索命令行参数?
解决方法
QStringList QCoreApplication::arguments(){ QStringList list; if (!self) { qWarning("QCoreApplication::arguments: Please instantiate the QApplication object first"); return list; } const int ac = self->d_func()->argc; char ** const av = self->d_func()->argv; for (int a = 0; a < ac; ++a) { list << QString::fromLocal8Bit(av[a]); } return list;}
这就是你所拥有的有一个Unicode警告,我不会认为会适用于Karmic:
“在Unix上,此列表是由argc和argv参数构建的,该参数传递给main()函数中的构造函数,argv中的字符串数据使用QString :: fromLocal8Bit()进行解释,因此不可能通过例如,在latin1语言环境中运行的系统上的日语命令行参数.大多数现代Unix系统没有这些限制,因为它们是基于Unicode的.
您可以直接在argc和argv上尝试该代码的副本,看看会发生什么.
c – 在x86应用程序中使用x64 dll
为此可以使用替代过程吗?
我知道在相反的情况下可以做这样的事情(在x64应用程序中运行x86 COM库),会有什么区别吗?
解决方法
On 64-bit Windows,an out-of-process
32-bit COM server can communicate with
a 64-bit client,and an out-of-process
64-bit COM server can communicate with
a 32-bit client.
http://msdn.microsoft.com/en-us/library/aa384231(VS.85).aspx
c – 跨平台Qt应用程序中的全局热键
我的印象是,Qt不提供处理快捷键的方法,除非应用程序是关注的,在我的情况下,它不会.所以,这是(如果这是一个可行的选择,请告诉我).
我发现了很多示例/文档,解释如何使用Xlib / Xcb进行linux,win32 api for windows,以及用于osx的碳,但是我很难找到一种适用于Qt应用的范围.
什么是完成我需要的方法?
解决方法
我们今天的关于在非Qt应用程序中使用基于Qt的DLL的分享就到这里,谢谢您的阅读,如果想了解更多关于1、Qt应用程序、c – 在Qt应用程序中获取命令行参数、c – 在x86应用程序中使用x64 dll、c – 跨平台Qt应用程序中的全局热键的相关信息,可以在本站进行搜索。
本文标签: