GVKun编程网logo

在非Qt应用程序中使用基于Qt的DLL

8

如果您想了解在非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应用程序中使用基于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吗?事件队列是否能够以这种方式运行?

我不想让我以后再吹起来。思考?

研究Qt代码,需要QCoreApplication来调度系统范围的消息,如定时器事件。像信号/插槽甚至QThreads这样的事情不依赖于它,除非它们与这些系统范围的消息相关。这是我如何在一个共享库(以跨平台的方式使用Qt本身)这样做,我实际上调用exec,因为processEvents()单独不处理一切。

我有一个全局命名空间:

// 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应用程序

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应用程序中获取命令行参数

c – 在Qt应用程序中获取命令行参数

以下片段来自我使用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;}

有没有人知道如何在我的应用程序中检索命令行参数?

解决方法

如果你的argc和argv很好,我很惊讶,这是可能的,因为QApplication :: arguments()非常简单.注意 the source code.过滤#ifdefs for Linux,它只是:
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

c – 在x86应用程序中使用x64 dll

我有一个DLL需要操作大量内存,并且必须是x64才能执行,但是调用它的应用程序是x86,不能转换为x64. COM已经用于应用程序和dll之间的交互.

为此可以使用替代过程吗?

我知道在相反的情况下可以做这样的事情(在x64应用程序中运行x86 COM库),会有什么区别吗?

解决方法

是的,你可以,应该没有区别,因为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应用程序中的全局热键

c – 跨平台Qt应用程序中的全局热键

我正在创建一个跨平台实用程序,在C使用Qt,我需要具有快捷键(或热键,不确定的区别).基本上,应用程序将运行,并且只能作为系统托盘中的图标显示,并在按某些快捷键(例如,Ctrl-Shift-f4或某些东西)时执行操作.

我的印象是,Qt不提供处理快捷键的方法,除非应用程序是关注的,在我的情况下,它不会.所以,这是(如果这是一个可行的选择,请告诉我).

我发现了很多示例/文档,解释如何使用Xlib / Xcb进行linux,win32 api for windows,以及用于osx的碳,但是我很难找到一种适用于Qt应用的范围.

什么是完成我需要的方法?

解决方法

看看 http://libqxt.bitbucket.org/doc/tip/qxtglobalshortcut.html

我们今天的关于在非Qt应用程序中使用基于Qt的DLL的分享就到这里,谢谢您的阅读,如果想了解更多关于1、Qt应用程序、c – 在Qt应用程序中获取命令行参数、c – 在x86应用程序中使用x64 dll、c – 跨平台Qt应用程序中的全局热键的相关信息,可以在本站进行搜索。

本文标签: