2016-09-22 2 views
1

Qt를 통해 외부 프로그램을 시작하고 프로그램을 Qt gridLayout (또는 Qt 창 내부)에 표시 할 수 있습니까?Qt는 Qt gridLayout에서 외부 프로그램을 시작합니다.

지금은 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 

mainwindow.cpp

해결책은 QT하여 응용 프로그램 실행의 창 ID를 검색하는 것입니다 그리고 당신이 같이 할 수
#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(); 


} 
+0

Linux의 경우 'QX11EmbedContai 그것의 ner'. – hank

+0

안녕 행크 귀하의 재생 주셔서 감사합니다, 나는 QX11EmbedContainer (http://doc.qt.io/qt-4.8/qx11embedcontainer.html#details)에 대한 조사를했지만 코드 Qt를 구현하면 나에게 오류가 발생합니다 (QX11EmbedContainer는 유형을 지정하지 않습니다. 라즈베리 파이의 Qt 코드이고 컴파일러는 G ++입니다. –

+2

어떤 버전의 Qt를 사용하고 있습니까? Qt5에서'QX11EmbedContainer'는 ['QWidget :: createWindowContainer'] (http://doc.qt.io/qt-5/qwidget.html#createWindowContainer)로 대체되었습니다. –

답변

1

:

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