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

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

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

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

上一篇:国密算法SM1-SM4简介


下一篇:SM2国密公钥格式开头04