如何在 QMainWindow 的默认布局中排列项目?
How to arrange the items in the default layout of 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();
}
您可以将 window 的布局更改为 QGridLayout
,它支持行、列和 row/column 跨度。这可以通过 setLayout()
函数来完成。
请注意,您必须先删除 window 中已经存在的默认布局,您可以使用 layout()
函数获取它。您可以参考 this documentation page 了解更多信息。
只需使用 delete this->layout()
将其删除,但请确保在此之后立即使用 setLayout()
进行设置。此外,如果您有嵌套布局,则必须手动删除它们。
如评论中所述,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
and/or grid_layout
个 class 成员,具体取决于您打算如何使用它们。)
这是我想要的安排:
------------ ------
| | | 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();
}
您可以将 window 的布局更改为 QGridLayout
,它支持行、列和 row/column 跨度。这可以通过 setLayout()
函数来完成。
请注意,您必须先删除 window 中已经存在的默认布局,您可以使用 layout()
函数获取它。您可以参考 this documentation page 了解更多信息。
只需使用 delete this->layout()
将其删除,但请确保在此之后立即使用 setLayout()
进行设置。此外,如果您有嵌套布局,则必须手动删除它们。
如评论中所述,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
and/or grid_layout
个 class 成员,具体取决于您打算如何使用它们。)