使用启动外部进程的方式解决there should be only one application object(使用qtwinmigrate中常出现)
生活随笔
收集整理的这篇文章主要介绍了
使用启动外部进程的方式解决there should be only one application object(使用qtwinmigrate中常出现)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
背景
解决问题
背景
有点时候,在Windows操作系统下,在dll中使用qtwinmigrate添加了qt界面,然后在MFC或者C#或者其他语言调用的时候不会出现问题,然而再用QtGUI程序去调用时就会出现如下的问题:
解决问题
dll的源码查阅下面这个链接的博文:
使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建主事件循环,qtwinmigrate的使用)
https://blog.csdn.net/qq78442761/article/details/87598078
有问题的源码如下:
twolivetimecycle.h
#ifndef TWOLIVETIMECYCLE_H #define TWOLIVETIMECYCLE_H#include <QtWidgets/QWidget> #include "ui_twolivetimecycle.h"class TwoLiveTimeCycle : public QWidget {Q_OBJECTpublic:TwoLiveTimeCycle(QWidget *parent = 0);~TwoLiveTimeCycle();protected slots:void btnClicked();private:Ui::TwoLiveTimeCycleClass ui; };#endif // TWOLIVETIMECYCLE_Hmain.cpp
#include "twolivetimecycle.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);TwoLiveTimeCycle w;w.show();return a.exec(); }twolivetimecycle.cpp
include "twolivetimecycle.h" #include <qmessagebox.h> #include <qdebug.h>#pragma comment(lib, "qtdialog.lib") extern "C" __declspec(dllexport) void showWidget();TwoLiveTimeCycle::TwoLiveTimeCycle(QWidget *parent): QWidget(parent) {ui.setupUi(this);connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(btnClicked())); }TwoLiveTimeCycle::~TwoLiveTimeCycle() {}void TwoLiveTimeCycle::btnClicked(){showWidget(); }这里采用启动外部进程的方式去解决!
首先构造一个外部进程的接口(写一个exe程序,这里用控制台表示):
控制台源码如下:
#include <iostream> using namespace std;#pragma comment(lib, "qtdialog.lib") extern "C" __declspec(dllexport) void showWidget();int main(int argc, char *argv[]){showWidget();getchar();return 0; }此时运行它,可以调出界面,如下图所示:
随后把这个exe的文件放好位置,使用Qt去调用!
运行截图如下:
这样就成功了,不会报错了!
正确源码如下:
twolivetimecycle.h
#ifndef TWOLIVETIMECYCLE_H #define TWOLIVETIMECYCLE_H#include <QtWidgets/QWidget> #include "ui_twolivetimecycle.h"class TwoLiveTimeCycle : public QWidget {Q_OBJECTpublic:TwoLiveTimeCycle(QWidget *parent = 0);~TwoLiveTimeCycle();protected slots:void btnClicked();private:Ui::TwoLiveTimeCycleClass ui; };#endif // TWOLIVETIMECYCLE_Hmain.cpp
#include "twolivetimecycle.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);TwoLiveTimeCycle w;w.show();return a.exec(); }twoivetimecycle.cpp
#include "twolivetimecycle.h" #include <qmessagebox.h> #include <qdebug.h> #include <qprocess.h>#pragma comment(lib, "qtdialog.lib") extern "C" __declspec(dllexport) void showWidget();TwoLiveTimeCycle::TwoLiveTimeCycle(QWidget *parent): QWidget(parent) {ui.setupUi(this);connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(btnClicked())); }TwoLiveTimeCycle::~TwoLiveTimeCycle() {}void TwoLiveTimeCycle::btnClicked(){QProcess *p = new QProcess(this);p->start("CallQtWidgetDemo.exe"); }
总结
以上是生活随笔为你收集整理的使用启动外部进程的方式解决there should be only one application object(使用qtwinmigrate中常出现)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Qt工作笔记-html做界面时,QFil
- 下一篇: 关于CSDN官方对博文点赞漏洞的处理(C