gpt4 book ai didi

c++ - 在 qt 应用程序内执行 qt 应用程序

转载 作者:行者123 更新时间:2023-12-03 03:11:43 25 4
gpt4 key购买 nike

我正在尝试将几个 qt 应用程序嵌入到另一个仅用作容器的应用程序中。 (我使用的是Linux)

让我们调用应用程序容器容器和执行的表单容器实用程序

容器中,我有一个QTabWidget,在这个QTabWidget中,我有一个带有名为utility1Widget的小部件的选项卡。

我想查看 utility1Widget 内实用程序的 GUI。

Edit2:最初的方法是错误的,我将其放在这里以供将来引用,但工作实现在我单独的答案中。

我尝试获取 utility1Widget 的 WId 并在 utility 的启动时间将其作为 arg 发送,但没有成功,例如:

实用程序.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
int containerWinId;
QWidget *parent=NULL;
if(argc==2) {
containerWinId=atoi(argv[1]);
parent = QWidget::find(containerWinId);
}

MarinaWindowClient w(parent);

w.show();
printf("Starting client window. Do you see something?\r\n");
fflush(stdout);
return a.exec();
}

结果,utility1Widget 是空的,但实用程序 GUI 没有出现在任何地方。

实用程序进程通过以下方式从容器启动:

mainContainer.cpp

marinaContainer::mainContainer(QWidget *parent) :
QWidget(parent),
ui(new Ui::mainContainer)
{
ui->setupUi(this);
WId myWinId=ui->utility1Widget->winId();
char cmd[1000];
sprintf(cmd," %d",myWinId);
QProcess *myProcess = new QProcess(this);
myProcess->start("utility1", QStringList(cmd));

printf("Client started\r\n");
fflush(stdout);
}

谢谢!!!

编辑 1 我添加了父变量来检查 find 函数的结果,它是 NULL,所以我遇到的第一个问题是我无法从实用程序获取容器小部件 id .

最佳答案

好的。这就是我用来实现目标的方法。

正如评论中提到的,对于 Qt 5.x,您必须使用两个函数 QWidget::createWindowContainerQWindow::fromWinId(WId id)在容器中。但调用函数的时机也很重要,以下实现是唯一适合我的实现,其他实现会得到空窗口或重复且有问题的窗口。

假设容器应用程序有一个垂直布局,我将把我的嵌入式应用程序放在该布局中。

在容器main.cpp中

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mainContainer w;
char cmd[1000];

QProcess *myProcess1 = new QProcess();
myProcess1->start("utility");
char buff[500];
buff[0]=0;
myProcess1->waitForStarted();
myProcess1->waitForReadyRead();

myProcess1->read(buff,100);
unsigned long long id1=atoll(buff);
fflush(stdout);
w.embedApps(id1);
myProcess1->write("continue\r\n");
w.show();
a.exec();
myProcess1->kill();
return 0;
}

在 mainContainer 窗口中,添加像这样的 embedApps 函数

void marinaContainer::embedApps(WId id1, WId id2)
{
QWindow *qw = QWindow::fromWinId(id1);
QWidget *w1= QWidget::createWindowContainer(qw,this);
ui->verticalLayout->addWidget(w1);
}

最后在实用程序应用程序中。main.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
utilityMainWindow w;
printf("%lld\r\n",w.winId());
fflush(stdout);
char trash[100];
//We wait until container was created and say 'ok, coninue'
scanf("%99s",trash);
w.show();
return a.exec();
}

您可以使用其他方法在父进程和子进程之间进行通信,但这对于本演示来说已经足够了。

希望对您有帮助!享受。

关于c++ - 在 qt 应用程序内执行 qt 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com