【问题标题】:How to arrange the items in the default layout of QMainWindow?QMainWindow的默认布局如何排列项目?
【发布时间】:2017-07-21 19:37:33
【问题描述】:

这是我想要的安排:

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

【问题讨论】:

  • 请注意,您真的不应该直接对QMainWindow 的布局进行任何操作。相反,您应该创建所需的小部件层次结构并将其传递给QMainWindow::setCentralWidget
  • @G.M.请考虑写一个小例子作为答案。
  • @G.M.你能参考一下上面写着you really shouldn't be doing anything with the layout of a QMainWindow directly的文档吗?
  • @SingerOfTheFall 不幸的是,文档没有明确说明。但是,如果您查看description of QMainWindow,很明显它提供的很多(大部分)功能都超出了普通的QWidget 的范围,这取决于它自己的私有布局——可移动工具栏、停靠小部件等。所以即使你确实设法用您自己的布局替换原始布局,您真正实现的是将QMainWindow 变成普通的QWidget - 额外的功能丢失了。

标签: c++ qt layout qmainwindow


【解决方案1】:

您可以将窗口的布局更改为QGridLayout,它支持行、列和行/列跨度。这可以通过setLayout() 函数来完成。

请注意,您必须首先删除窗口中已经就位的默认布局,您可以使用layout() 函数获得该布局。您可以参考this documentation page 了解更多信息。

只需使用delete this-&gt;layout() 将其删除,但请确保在此之后立即使用setLayout() 进行设置。此外,如果您有嵌套布局,则必须手动删除它们。

【讨论】:

  • 我可以看到layout()-&gt;deleteLater函数。你说的是这个吗?
  • 只需使用delete widget-&gt;layout() 将其删除,请确保在此之后立即使用setLayout() 进行设置。此外,如果您有嵌套布局,则必须手动删除它们(请参阅此问题的第二个答案:stackoverflow.com/questions/7528680/…
  • 哇,我在 2011 年问过这个问题!顺便说一句,在第二个答案下有一条评论。你怎么看?
  • @AquariusTheGirl,哈!我什至没有注意到这个问题也是你的。有点不清楚,因为addLayout 重载之一的文档说父布局拥有子布局,但另一个重载的文档没有提到它。您可能需要自己检查以确保,因为自 2011 年以来行为可能会发生变化。
  • 或者你能解释一下关于这个问题的新评论吗? stackoverflow.com/questions/42549303/…
【解决方案2】:

如 cmets 中所述,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 成为您班级的成员.)

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2013-02-05
    • 2013-05-24
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多