先放效果图,就是在qt运行的界面中,不只是运行出了外部exe的界面,还可以在外围放置自定义的功能按钮。(本质就是在QWidget中添加工具栏QToolBar)
关于如何只运行出外部的exe,我之前写过教程:https://blog.csdn.net/changyana/article/details/128436097。关于如何运行外部exe的那部分代码我将不做赘述,因为在前边这篇教程中已经给出讲解。建议先看一遍之前的教程及代码,本篇文章我是在之前代码的基础上进行分析和工具栏添加的。
首先就是创建一个新项目,区别于之前的教程(指的是我上边放链接的那篇教程),在Class选择这里,本次选择的是QWidget,之前选择的是MainWindow。(因为我看了一下之前运行出来的代码,之前的代码是在MainWindow的类里新建使用了QWidget,也没有用到MainWindow,这次干脆直接就创建QWidget的类)
还有之前的代码是直接放在main.cpp里的,个人觉得main.cpp主要是用来作为程序的启动入口,而加载的功能函数应该实现模块化,放在其它的功能cpp文件里,所以本次实现是将上述的功能都放在了widget.cpp的构造函数里。
看一下文件结构
主要的实现思路就是分为两部分,在页面放置了两个QWidget。第一个QWidget就是QToolBar(因为QToolBar是继承自QWidget,看下图),第二个QWidget就是加载出的外部exe,然后自己设置一下垂直布局,就可以展现出上边的示例图样式。
下边我放上widget.cpp
文件的代码。
#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QProcess>
#include <QWindow>
#include <Windows.h>
#include <QVBoxLayout>
#include <QToolBar>
#include <QAction>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 运行第三方exe
QProcess *m_process = new QProcess();
m_process->start("D:/homework/Blender/build_windows_x64_vc17_Release/bin/Debug/blender.exe",QStringList()<<""); // 1.可执行exe的路径
if(!m_process->waitForFinished(-1))
{
qDebug()<<"--------";
}
WId wid = (WId)FindWindow(L"GHOST_WindowClass", NULL); // 2.需要嵌入的exe的界面的类名称
QWindow *m_window = QWindow::fromWinId(wid);
m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
QWidget *m_widget = QWidget::createWindowContainer(m_window, this);
m_widget->setMinimumSize(1000, 800);//外部exe窗口大小
// 自定义功能按钮
QAction *new_action = addAction("新建");
QAction *open_action = addAction("打开");
QToolBar *tool_bar = new QToolBar();
tool_bar->addAction(new_action);
tool_bar->addAction(open_action);
QVBoxLayout *vbox_layout = new QVBoxLayout();
vbox_layout->addWidget(tool_bar); // 添加功能按钮
vbox_layout->addWidget(m_widget); // 添加外部exe
setLayout(vbox_layout);
// 响应功能按钮
connect(new_action, &QAction::triggered, this ,[=](){
qDebug() << "点击了新建";
});
connect(open_action, &QAction::triggered, this ,[=](){
qDebug() << "点击了打开";
});
}
Widget::~Widget()
{
delete ui;
}
可以看到我的第三方exe设置的宽高是1000*800,所以最外层的界面窗口一定要大于这个,我是设置的1200*900
然后widget.h和main.cpp都没有做改动,都是系统默认生成的,更改的文件是widget.cpp和widget.ui。
然后保存运行,就可以看到如图效果啦!