徐汇网站推广,themeforest wordpress,中国企业网站建设案例,国家企业信息年报系统一、前言
使用QT开发#xff0c;有时需要调用一些外部程序#xff0c;但是单独打开一个外部窗口有的场合很不合适#xff0c;最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序#xff0c;一个主程序托n个子程序#xff0c;为了方便管理将各个程序独立#xf…一、前言
使用QT开发有时需要调用一些外部程序但是单独打开一个外部窗口有的场合很不合适最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序一个主程序托n个子程序为了方便管理将各个程序独立但是运行还要整体去一起也就需要将各个子程序嵌入到主程序预留的窗口处。
本文主要从以下几个方面进行总结
将外部程序嵌入到主程序窗口中外部程序与主程序通讯暂无总结
二、环境
qt5.7
window10
CPU是AMD Ryzen 7 4800U with Radeon Graphics 1.80 GHz可能有关联
三、正文
将外部程序嵌入到主程序窗口中
方法千篇一律在网上搜索有很多的方法找到最合适的方法才是最重要的这里我主要总结在我的电脑上能够正常运行的方法。
主程序名称mytool子程序名称note主程序创建一个widget给子程序预留核心代码如下 //启动外部程序QProcess *process1 new QProcess(this);process1-setProcessChannelMode(QProcess::MergedChannels);//通道设置可不加process1-start(../可执行程序/note.exe);//qApp-applicationDirPath()/note.execonnect(this,QObject::destroyed,[](){process1-close();});//程序关闭时关闭子程序Sleep(500);//延时必须加不加不好使HWND handle FindWindow(nullptr, Lnote);//使用process1-pid()不好使只能用这种方式
// qDebug()(WId)handle(WId)process1-pid()process1-pid();if(handle ! nullptr){//nullptrQWindow* externWindow QWindow::fromWinId((WId)handle);QWidget* container_note QWidget::createWindowContainer(externWindow, ui-widget_note);//存放外部窗口的Widget//将外部程序窗口嵌入到QWidget子类中显示container_note-setGeometry(0, 0, externWindow-width(), externWindow-height());//设置嵌入的窗口位置ui-btn_menu_2-setEnabled(true);//记事本加载成功}else{tray-showMessage(消息,加载失败程序损坏或丢失请检查,QSystemTrayIcon::MessageIcon::Warning,1000);//发送通知消息 //显示信息图标(NoIcon/Information/Warning/Critical)ui-btn_menu_2-setEnabled(false);//加载成功 失能按键}
重点1Sleep延时函数必须得有否则QProcess外部程序还没启动完全是无法正常获取窗口ID的也就嵌入不成功。
重点2使用FindWindow函数返回数据类型定义为HWND未使用WID会失败也没有使用process1.pid()获取ID也会失败目前测试只有这种方式获取外部窗口句柄好使。
重点3本程序未使用如果是调用其他第三方程序不是自己开发的子程序需要使用SPY获取窗口句柄网上随便就能下载选择查找窗口拖拽准心到目标窗口就能看见返回值。延时时间需要根据外部第三方程序启动时间动态调整很可能时间不够也不好使。 重点4嵌入的窗口如果是固定尺寸嵌入完毕后使用setGenmetry设置一下窗口位置和大小否则会有大家常说的白边PS吐槽一句有的人写博客就这一个小破功能就要把自己博客订阅花钱才能看守着你的文章发霉去吧。如果是不固定尺寸可调节大小将widget创建为私有全局对象使用event重新根据预留的widget窗口大小动态调整嵌入的程序大小。
。h
pravite
QWidget* container_note nullptr; //存放外部窗口的Widget
。cpp
void Widget::resizeEvent(QResizeEvent *event) //外部窗口大小随动
{QWidget::resizeEvent(event);if (container_note ! nullptr){container_note-resize(event-size());}
}外部程序与主程序通讯暂无总结
内部通信也可以通过信号槽等绑定消息也可以通过读取公共文本文件实现这里暂时未使用到 四、结语
参考文章1