ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-18 02:51:05  阅读:196  来源: 互联网

标签:linux c-4 qt x11


我试图将几个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::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();
}

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

希望能帮助到你!请享用.

标签:linux,c-4,qt,x11
来源: https://codeday.me/bug/20191118/2024895.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有