我试图将几个qt应用程序嵌入另一个仅用作容器的应用程序中. (我正在使用linux)
让我们调用应用程序容器容器和一个已执行的表单容器实用程序
在容器中,我有一个QTabWidget,在这个QTabWidget中,我有一个Tab,其中包含一个名为utility1Widget的小部件.
我想在Utility1Widget中看到该实用程序的GUI.
Edit2:最初的方法是错误的,我在这里供以后参考,但是有效的实现仍在我的单独答案中.
我尝试获得成功,但未成功获取Utility1Widget的WId,并在实用程序启动时将其作为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.
解决方法:
好.这是我曾经实现的方式.
如注释中所述,对于Qt 5.x,必须在容器中使用两个功能QWidget::createWindowContainer和QWindow::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();
}
您可以使用另一种方法在父进程和子进程之间进行通信,但这对于本演示来说已经足够.
希望能帮助到你!请享用.