2017-03-02 2 views
0

C'est l'arrangement que je veux:Comment organiser les éléments dans la disposition par défaut de QMainWindow?

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

Le problème est que la fonction addwidget de la mise en page par défaut n'a pas les paramètres pour les lignes et colonnes. Je ne peux même pas ajouter QVBoxLayout puisque le compilateur dit qu'une mise en page est déjà là, donc vous ne pouvez pas ajouter plus de mises en page.

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

Notez que vous ne devriez vraiment pas faire * n'importe quoi * avec la disposition d'un 'QMainWindow' directement. Au lieu de cela, vous devez créer la hiérarchie de widget dont vous avez besoin et la transmettre à ['QMainWindow :: setCentralWidget'] (http://doc.qt.io/qt-5/qmainwindow.html#setCentralWidget). –

+0

@ G.M. S'il vous plaît envisager d'écrire un petit exemple comme une réponse. –

+0

@ G.M. pourriez-vous donner une référence aux docs où il est dit que «vous ne devriez vraiment pas faire quelque chose avec la disposition d'un QMainWindow directement»? – SingerOfTheFall

Répondre

1

Comme indiqué dans les commentaires, l'utilisation prévue de QMainWindow est que vous créez la hiérarchie de votre widget souhaité, puis passez à QMainWindow::setCentralWidget. Dans cet esprit, plutôt que ...

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

ce que vous pouvez essayer quelque chose comme ...

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

Ainsi la hiérarchie widget que vous voulez est placé sous central_widget et que, à son tour, est passé à QMainWindow::setCentralWidget.

(Note:. Je devine que la mise en place de m_QCameraViewfinder_viewfinder et m_QPushButton_calibration dans le QGridLayout et vous voudrez peut-être faire central_widget et/ou grid_layout membres de votre classe en fonction de la façon dont vous avez l'intention de les utiliser)

1

Vous pouvez modifier une disposition de la fenêtre à un QGridLayout, qui prend en charge des lignes, des colonnes et des lignes/colonnes couvre. Cela peut être fait avec la fonction setLayout().

Notez que vous devez d'abord supprimer la disposition par défaut qui est déjà en place dans la fenêtre, ce que vous pouvez obtenir avec la fonction layout(). Vous pouvez vous référer à this documentation page pour plus d'informations.

Il suffit de le supprimer avec delete this->layout(), mais assurez-vous que vous définissez quelque chose avec setLayout() juste après cela. Aussi, si vous avez imbriqué des mises en page, vous devrez les supprimer manuellement.

+0

Je peux voir la fonction 'layout() -> deleteLater'. Est-ce ce dont vous parlez? –

+0

Il suffit de le supprimer avec 'delete widget-> layout()', __but__ assurez-vous de définir quelque chose avec 'setLayout()' juste après cela. Aussi, si vous avez des mises en page imbriquées, vous devrez les supprimer manuellement (voir la deuxième réponse à cette question: http://stackoverflow.com/questions/7528680/how-to-delete-an-already-existing-layout-on- a-widget/12034868) – SingerOfTheFall

+0

Wow, j'ai posé cette question en 2011! BTW, sous cette deuxième réponse, il y a un commentaire. Qu'en pensez-vous? –