2017-03-02 4 views
0

Dies ist die Anordnung, die ich will:Wie ordnen Sie die Elemente im Standardlayout von QMainWindow an?

------------ ------ 
|   | | 2 | 
|   | | | 
|  1 | ------ 
|   | ------ 
|   | | 3 | 
------------ ------ 

Das Problem ist, dass die addwidget Funktion des Standard-Layouts nicht die Parameter für die Zeilen und Spalten enthält. Ich kann nicht einmal QVBoxLayout hinzufügen, da der Compiler sagt, dass ein Layout bereits da ist, so dass Sie keine weiteren Layouts hinzufügen können.

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    m_QPushButton_calibration = new QPushButton("Calibrate", this); 
    connect(m_QPushButton_calibration, SIGNAL (released()),this, SLOT (handleButton())); 

    QList<QCameraInfo> l_QListQCameraInfo_available_cameras = QCameraInfo::availableCameras(); 

    m_QCameraViewfinder_viewfinder = new QCameraViewfinder(this); 

    if (l_QListQCameraInfo_available_cameras.length() > 2) 
    { 
     m_QCamera_required_camera = new QCamera (l_QListQCameraInfo_available_cameras[1]); 
     m_QCamera_required_camera->setViewfinder(m_QCameraViewfinder_viewfinder); 
     m_QCamera_required_camera->start(); 
    } 

    this->layout()->addWidget(m_QPushButton_calibration); 
    this->layout()->addWidget(m_QCameraViewfinder_viewfinder); 

    m_QCameraViewfinder_viewfinder->show(); 
} 
+0

Beachten Sie, dass Sie wirklich nichts mit dem Layout eines 'QMainWindow' direkt tun sollten. Stattdessen sollten Sie die gewünschte Widget-Hierarchie erstellen und diese an ['QMainWindow :: setCentralWidget'] (http://doc.qt.io/qt-5/qmainwindow.html#setCentralWidget) übergeben. –

+0

@ G.M. Bitte denken Sie über ein kleines Beispiel als Antwort nach. –

+0

@ G.M. Könntest du einen Hinweis auf die Dokumente geben, in denen steht, dass "du wirklich nichts mit dem Layout eines QMainWindow direkt machen solltest"? – SingerOfTheFall

Antwort

1

Wie in den Kommentaren angegeben, besteht die beabsichtigte Verwendung von QMainWindow darin, dass Sie die gewünschte Widget-Hierarchie erstellen und diese dann an QMainWindow::setCentralWidget übergeben. Mit dem im Verstand, anstatt ...

this->layout()->addWidget(m_QPushButton_calibration); 
this->layout()->addWidget(m_QCameraViewfinder_viewfinder); 
m_QCameraViewfinder_viewfinder->show(); 

was könnten Sie versuchen, ist so etwas wie ...

QWidget *central_widget = new QWidget; 
QGridLayout *grid_layout = new QGridLayout; 
central_widget->setLayout(grid_layout); 
grid_layout->addWidget(m_QCameraViewfinder_viewfinder, 0, 0, 2, 1); 
grid_layout->addWidget(m_QPushButton_calibration, 0, 1, 1, 1); 
setCentralWidget(central_widget); 

So ist die Widget-Hierarchie Sie unter central_widget und abgelegt werden soll, wiederum, wird an QMainWindow::setCentralWidget übergeben.

. (Anmerkung: Ich schätze, dass in Bezug auf die Platzierung von m_QCameraViewfinder_viewfinder und m_QPushButton_calibration im QGridLayout und Sie können central_widget und/oder grid_layout Mitglieder Ihrer Klasse zu machen, je nachdem, wie Sie beabsichtigen, sie zu benutzen)

1

Sie ein Layout des Fensters zu einem QGridLayout ändern können, die erstreckt sich über Zeilen, Spalten und Zeilen/Spalten unterstützt. Dies kann mit setLayout() Funktion durchgeführt werden.

Beachten Sie, dass Sie zuerst das Standardlayout löschen müssen, das bereits in dem Fenster vorhanden ist, das Sie mit der Funktion layout() erhalten können. Weitere Informationen finden Sie unter this documentation page.

Löschen Sie einfach mit delete this->layout(), aber stellen Sie sicher, dass Sie etwas mit setLayout() gleich danach setzen. Auch wenn Sie geschachtelte Layouts haben, müssen Sie sie manuell löschen.

+0

Ich kann 'layout() -> deleteLater' Funktion sehen. Sprechen Sie darüber? –

+0

Löschen Sie es einfach mit 'delete widget-> layout()', __aber stellen Sie sicher, dass Sie etwas später mit 'setLayout()' setzen. Auch wenn Sie geschachtelte Layouts haben, müssen Sie sie manuell löschen (siehe die zweite Antwort auf diese Frage: http://stackoverflow.com/questions/7528680/how-to-delete-an-ready-existing-layout-on- a-widget/12034868) – SingerOfTheFall

+0

Wow, ich habe diese Frage 2011 gestellt! BTW, unter dieser zweiten Antwort gibt es einen Kommentar. Was denkst du darüber? –

Verwandte Themen