添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

首先看GitHub提供的示例:

下载 qtwinmigrate: https://github.com/qtproject/qt-solutions
如 github 无法下载,可使用: https://pan.baidu.com/s/1kG2WGMYb7hk6ppfMqhd8eQ 提取码: 34sh

解压,找到 \qtwinmigrate\examples\qtdll\qtdll.pro,使用QtCreator打开:

#include <qmfcapp.h>
#include <qwinwidget.h>
#include <QMessageBox>
#include <windows.h>
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ )
    static bool ownApplication = FALSE;
    if ( dwReason == DLL_PROCESS_ATTACH )
	ownApplication = QMfcApp::pluginInstance( hInstance );
    if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
	delete qApp;
    return TRUE;
extern "C" __declspec(dllexport) bool showDialog( HWND parent )
    QWinWidget win( parent );
    win.showCentered();
    return TRUE;

编译后,生成qtdialog.dll

新建控制台程序(用来调用qtdialog.dll),代码如下:

#include <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
typedef bool(*pShowDialog)(HWND parent);
int main()
	//center show
	RECT rcDesk;
	GetWindowRect(GetDesktopWindow(), &rcDesk);
	RECT rc;
	GetWindowRect(GetConsoleWindow(), &rc);
	int x = rcDesk.left + (rcDesk.right - rcDesk.left) / 2 - (rc.right - rc.left) / 2;
	int y = rcDesk.top + (rcDesk.bottom - rcDesk.top) / 2 - (rc.bottom - rc.top) / 2;
	int cx = (rc.right - rc.left);
	int cy = (rc.bottom - rc.top);
	SetWindowPos(GetConsoleWindow(), NULL, x, y, cx, cy, SWP_NOSIZE);
    std::cout << "Hello World!\n";
	const char* dllName = "qtdialog.dll";
	HMODULE hDLL = LoadLibraryA(dllName);
	if (hDLL != NULL)
		pShowDialog fp = pShowDialog(GetProcAddress(hDLL, "ShowDialog"));
		if (fp != NULL)
			//ShowWindow(GetConsoleWindow(), SW_HIDE);
			std::cout << "pShowDialog!\n";
			fp(GetConsoleWindow());
		FreeLibrary(hDLL);
		cout << "Cannot Find " << dllName << endl;
	system("pause");
	return 0;

使用 windeployqt 拉取 qtdialog.dll 所依赖的文件,并将其一同放置在控制台生成的目录下,运行控制台程序,即可看到控制台程序调起了qt的dll。
在这里插入图片描述
如果需要在dll中开发自定义界面的,代码也很简单。比如说,开发一个专门用于选择文件路径的dll:

extern "C" __declspec(dllexport) bool ShowDirDialog(HWND parent)
	QWinWidget win(parent);
	win.center();
	QtDirDlg dlg(&win);
	dlg.exec();
	return TRUE;
                    首先看GitHub提供的示例:下载 qtwinmigrate:https://github.com/qtproject/qt-solutions解压,找到 \qtwinmigrate\examples\qtdll\qtdll.pro,使用QtCreator打开:#include &lt;qmfcapp.h&gt;#include &lt;qwinwidget.h&gt;#include &lt;QMessageBox&gt;#include &lt;windows.h&gt;BOOL WI
				
之前写了一篇《MFC调用Qt使用MinGW编译的界面dll解答》,这一篇本来打算写如何隔离Qt的依赖dll到单独目录,但是有个更重要的问题需要解决,那就是如果使用那篇文章中的方法调用Qtdll,会发现程序无法正常退出——即关闭了QT界面之后,无法正确FreeLibrary,MFC程序也无法正常退出(除非强行结束进程)。 那么这个问题该如何解决呢,其实已经有很成熟的开源库qtwinmigrate给出了解决方案,目前测试Qt5.0可用,该库的下载地址为:GitHub - qtproject/qt-sol
这边和大家分享一个最近做的项目,来演示如何生成供MFC调用QT界面DLL 项目功能:读取本地视频,并判断每帧图片的水流方向以及角度,并在界面上绘制罗盘,和定位辅助线(ps:关于视觉部分代码,在下面开源的项目中我删除掉了) 程序功能效果展示 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt界面出来,官方已经给出了一个API了,为qtwinmigrate。大家可以参考这位博主的调用方式实现。 关于qtwinmigrate大家
http://doc.qt.digia.com/solutions/4/qtwinmigrate/winmigrate-walkthrough.html(原文地址) 这个练习是基于MFC生成的程序迁移到Qt的例子,这个程序通过微软Visual Studio的MFC应用程序向导生成。  入门(Getting Started) (注:这个例子在文件qtwinmigrate-2.8-opens
本资源包括4个文件夹,myQtMainWindowDll文件夹里面是qt的工程文件;build-qtdll-Desktop_Qt_5_12_2_MSVC2015_64bit-Release文件夹是qt编译生成的文件夹;QtReleaseDll文件夹里面是最重要的qtdialog.dll以及他所依赖的所有的库;CsharpUseQtDll文件夹里面是c#工程。 具体使用细节参见我的博客:https://blog.csdn.net/weixin_43935474/article/details/105531814
既然QT也是C++,而且有个大名鼎鼎的WPS都是QTMFC混合编程的,所以肯定有方法的,百度谷歌,找到一个qtwinmigrate的东西,在这里万分感谢qtwinmigrate的作者! 好吧,参考里面的例子,正式开始编写了,咱就先来一个最初级的吧。 打开qt creator,新建C++ 库项目 依次下一步,记得在选择需要的模块的时候选择QtGu
### 回答1: 在Qt编程中,要实现点击按钮调用外部程序,可以使用Qt的QProcess类。 首先,我们需要在Qt工程中创建一个按钮,并在相应的槽函数中编写调用外部程序的代码。 在点击按钮的槽函数中,我们可以创建一个QProcess对象,并通过QProcess的start方法来启动外部程序。 下面是一个简单的示例代码: ```cpp void MainWindow::on_button_clicked() // 创建QProcess对象 QProcess *process = new QProcess(this); // 设置要调用外部程序路径 QString program = "C:/path/to/external/program"; // 设置外部程序的命令行参数(如果有的话) //QStringList arguments; //arguments << "argument1" << "argument2"; // 启动外部程序 process->start(program); // 或者使用 process->startDetached(program) 来在后台运行程序 // 检查是否启动成功 if (!process->waitForStarted()) // 启动失败,显示错误信息 QString error = process->errorString(); QMessageBox::critical(this, "Error", "Failed to start external program: " + error); 在上述代码中,按钮点击事件的槽函数为`on_button_clicked()`,在这个函数中我们首先创建了一个QProcess对象process,然后设置要调用外部程序的路径和命令行参数(如果有的话),最后调用process的start方法来启动外部程序。启动之后,我们可以通过waitForStarted()函数来等待程序是否成功启动,如果启动失败,可以通过errorString()获取错误信息并进行处理。 这样,当我们点击按钮时,就会调用外部程序。 ### 回答2: 在Qt编程中,要实现点击按钮调用外部程序,可以使用Qt的信号与槽机制。 首先,需要在Qt的工程文件(*.pro文件)中添加一个外部程序的路径,例如: LIBS += -L/path/to/external/program -lexternalProgram 接下来,在代码中创建一个按钮,并连接按钮的"clicked"信号与一个槽函数。 然后,在槽函数中使用QProcess类来执行外部程序。QProcess提供了启动外部程序并与其进行交互的功能。 以下是一个示例代码: ```cpp // 头文件 #include <QPushButton> #include <QProcess> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { QPushButton *button = new QPushButton("调用外部程序", this); connect(button, &QPushButton::clicked, this, &MyWidget::startExternalProgram); private slots: void startExternalProgram() { QProcess *process = new QProcess(this); process->start("/path/to/external/program"); // 启动外部程序,传入路径 process->waitForFinished(); // 等待外部程序执行完毕 以上代码中,当按钮被点击时,会调用startExternalProgram槽函数。该函数创建一个QProcess对象,并调用其start函数来启动外部程序。waitForFinished函数会阻塞当前线程,直到外部程序执行完毕。 注意,路径"/path/to/external/program"应替换为真实的外部程序的路径。另外,在使用QProcess时,还可以通过信号与槽机制来处理外部程序的输出、错误信息等。 通过上述方法,就可以在Qt编程中实现点击按钮调用外部程序的功能。 ### 回答3: 在Qt编程中,我们可以使用QProcess类来实现点击按钮调用外部程序。QProcess是Qt提供的用于启动外部进程的类。 首先,在Qt Creator中创建一个新的项目,并在主窗口中设计一个按钮(如"调用外部程序"),并关联一个槽函数。 接下来,我们需要在相关的槽函数内部编写代码来实现调用外部程序的功能。具体步骤如下: 1. 在槽函数内部创建一个QProcess对象。 ```cpp QProcess process; 2. 设置要调用外部程序路径。 ```cpp QString programPath = "外部程序路径"; process.setProgram(programPath); 3. 可选:如果需要传递参数给外部程序,可以使用setArguments()函数。 ```cpp QStringList arguments; arguments << "参数1" << "参数2"; process.setArguments(arguments); 4. 启动外部程序。 ```cpp process.start(); 以上就是实现点击按钮调用外部程序的基本步骤。需要注意的是,外部程序的路径需要根据实际情况进行设置,同时还可以根据需要设置参数传递给外部程序。另外,点击按钮之前,需要确保外部程序已经正确安装并设置了正确的路径。 希望以上回答对您有所帮助!