2017-03-02 67 views
0

這是我想要的安排:如何安排QMainWindow默認佈局中的項目?

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

的問題是,默認佈局的addwidget函數不具有行和列的參數。我甚至不能添加任何QVBoxLayout,因爲編譯器說佈局已經存在,所以您不能添加更多佈局。

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

請注意,你真的不應該直接用'QMainWindow'的佈局來做任何事*。相反,您應該創建您需要的窗口小部件層次結構,並將其傳遞給['QMainWindow :: setCentralWidget'](http://doc.qt.io/qt-5/qmainwindow.html#setCentralWidget)。 –

+0

@ G.M。請考慮寫一個小例子作爲答案。 –

+0

@ G.M。你可以參考一下文檔,它說「你真的不應該直接對QMainWindow進行任何佈局」。 – SingerOfTheFall

回答

1

正如評論中所述,QMainWindow的預期用途是您創建所需的小部件層次結構,然後將其傳遞給QMainWindow::setCentralWidget。考慮到這一點,而不是...

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

你可以嘗試是一樣的東西......

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); 

所以,你要的小部件的層次結構被放置central_widget下和,反過來,傳遞給QMainWindow::setCentralWidget

(注:我猜爲m_QCameraViewfinder_viewfinder和m_QPushButton_calibration安置在QGridLayout,你可能想使這取決於你打算如何使用這些類的central_widget和/或grid_layout成員)

1

你可以改變窗口的一個QGridLayout佈局,支持行,列和行/列跨越。這可以使用setLayout()函數完成。

請注意,您必須先刪除已在窗口中的默認佈局,您可以使用layout()函數獲取該佈局。你可以參考this documentation page瞭解更多信息。

只需用delete this->layout()將其刪除,但請確保在此之後立即設置了setLayout()。同樣,如果你有嵌套佈局,你將不得不手動刪除它們。

+0

我可以看到'layout() - > deleteLater'函數。那是你在說什麼? –

+0

只需使用'delete widget-> layout()',__but__刪除它,確保你在'setLayout()'後面設置了一些東西。此外,如果你有嵌套的佈局,你將不得不手動刪除它們(請參閱第二個問題的答案:http://stackoverflow.com/questions/7528680/how-to-delete-an-already-existing-layout-on- a-widget/12034868) – SingerOfTheFall

+0

哇,我在2011年問過這個問題!順便說一句,在第二個答案下有一條評論。你怎麼看呢? –