【发布时间】:2016-10-31 18:13:25
【问题描述】:
我正在尝试将几个 qt 应用程序嵌入到另一个仅用作容器的应用程序中。 (我用的是linux)
让我们调用应用程序容器container和一个执行的表单容器utility
在容器中,我有一个QTabWidget,在这个QTabWidget 中,我有一个带有一个名为utility1Widget 的小部件的Tab。
我想在utility1Widget 中查看utility 的GUI。
Edit2:最初的方法是错误的,我把它放在这里以供将来参考,但我的单独答案中有一个有效的实现。
我尝试获取utility1Widget 的WId 并在utility 开始时将其作为arg 发送,但未成功,类似于:
utility.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 .
【问题讨论】:
-
根据这个link我的方法看起来不太好,因为find只获取本地窗口ID'
-
如果您有本地窗口 ID,请查看
QWidget::createWindowContainer和QWindow::fromWinId。 -
您使用的是哪个版本的 Qt?
-
谢谢@G.M.我正在使用 Qt 5.6。我将其投入使用,但这有点棘手,而且我没有“干净”的方法来做到这一点。容器必须启动实用程序,实用程序必须创建窗口并返回 id 但不显示()窗口,然后容器用 createWindowContainer “捕获”窗口将小部件添加到 UI,最后在此之后客户端可以显示()主窗口。如果你在奇怪的事情开始发生之前这样做,比如显示两个窗口和类似的事情。我发现的唯一方法是在 show() 之前睡觉,但正如我所说,它非常脏。
-
不太确定我是否遵循但...尝试从
QWidget *上的容器调用QWidget::show,该容器从QWidget::createWindowContainer返回,而不是从客户端/实用程序返回。这不应该遇到任何与时间相关的问题。