【问题标题】:Qt start an external program in Qt gridLayoutQt在Qt gridLayout中启动一个外部程序
【发布时间】:2016-09-22 10:08:17
【问题描述】:

我想知道,是否可以通过 Qt 启动外部程序并在 Qt gridLayout(或 Qt 窗口内)中显示该程序?

目前,我可以通过 Qt 启动外部程序,但我还没有找到在 QtWindow 中显示程序的方法。换句话说,程序只是出现在 Qt 窗口之外。

Qt Pro file
#-------------------------------------------------
#
# Project created by QtCreator 2016-09-21T16:31:30
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = WifiProject
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork/QNetworkConfigurationManager>
#include <QtNetwork/QNetworkSession>
#include <QtNetwork/QNetworkInterface>
#include <QDebug>
#include <QList>

#include <QProcess>
#include <QWidget>
#include <QBoxLayout>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_StartWicd_clicked();

private:
    Ui::MainWindow *ui;
    void searchForNetwork();
    QProcess *wicdProgram;

    void addWicdProgram();
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWindow>


QString program = "/usr/bin/wicd-gtk";

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    searchForNetwork();
    addWicdProgram();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::searchForNetwork(){

}

void MainWindow::addWicdProgram(){
    wicdProgram = new QProcess(this);
    wicdProgram->setProgram(program);


    WId winid = this->winId();
    QWindow *container = QWindow::fromWinId(winid);
    QWidget *program_start = createWindowContainer(container);
    setCentralWidget(program_start);


    ui->wifiGridLayout->addWidget(program_start);
    wicdProgram->start();


    qDebug()<<"wicd addded";
    //ui->wifiGridLayout->addWidget(program_start);
}

void MainWindow::on_StartWicd_clicked()
{
    //wicdProgram->start(program);
    qDebug()<<"the wicd should have started";
    wicdProgram->terminate();


}

【问题讨论】:

  • 在 Linux 上,您可以使用 QX11EmbedContainer
  • 嗨 hank 谢谢你的重播,我对 QX11EmbedContainer (doc.qt.io/qt-4.8/qx11embedcontainer.html#details) 做了一些研究,但是当我实现代码时 Qt 给了我一个错误(QX11EmbedContainer 没有命名类型)。我在树莓派中用qt编写代码,编译器是G++。
  • 您使用的是哪个版本的 Qt?对于 Qt5,QX11EmbedContainer 已替换为 QWidget::createWindowContainer
  • 您好,GM,我已经按照您的建议调查了 QWidget::createWindowContainer。但是,程序仍然在我的 QGridLayout 之外启动。 :(
  • 您可以编辑问题以显示相关代码吗?

标签: linux qt qgridlayout


【解决方案1】:

一种解决方案是通过 qt 检索应用程序启动的窗口 id,您可以这样做:

QWindow *window = QWindow::fromWinId("Id of the application");
window->setFlags(Qt::FramelessWindowHint);
QWidget *widget = QWidget::createWindowContainer(window);

【讨论】:

  • 如何获取应用程序的窗口 ID?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多