Qt小部件未显示在主窗口中。

3
我正在尝试创建主应用程序窗口。它应该有一个菜单栏,并显示一个带有分隔符的标签。我的主窗口代码如下。
我遇到的问题是菜单栏显示出来了,但标签和分隔符没有显示出来。我尝试过以下几种方法:
1. 将分隔符的父级设置为“this” -> 分隔符会显示,但会画在菜单栏上并且很小。 2. 将标签的父级设置为“this” -> 标签会显示,但会画在菜单栏上。 3. 将分隔符、父级和标签的父级都设置为“this” -> 标签不会显示,我得到了迷你版的分隔符,在菜单栏下面绘制。 4. 尝试重新排列代码行并得到各种其他结果,例如大的分隔符在菜单栏上绘制,不随窗口大小调整大小,小的分隔符在菜单栏下面,只有菜单栏什么也没有等等 - 没有有用的结果。
看起来垂直布局完全被忽略了。
不知道还能尝试什么。有什么建议吗?
MyWindow::MyWindow(IViewSignalHandler* signalHandler, QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    m_signalHandler = signalHandler;

    // menu
    m_fileMenu = new QMenu(tr("&File"));
    m_fileMenu->addAction(tr("&Open"), this, SLOT(slot_OpenFile(bool)));

    m_helpMenu = new QMenu(tr("&Help"));
    m_helpMenu->addAction(tr("&About"), this, SLOT(slot_ShowAboutBox(bool)));

    menuBar()->addMenu(m_fileMenu);
    menuBar()->addMenu(m_helpMenu);

    // graph
    m_graphWidget = new QwtPlot();
    m_graphLegend = new QwtLegend();
    m_graphLegend->setItemMode(QwtLegend::CheckableItem);
    m_graphWidget->insertLegend(m_graphLegend, QwtPlot::RightLegend);
    m_graphWidget->setAxisTitle(QwtPlot::xBottom, tr("X"));
    m_graphWidget->setAxisScale(QwtPlot::xBottom, DEFAULT_X_MIN, DEFAULT_X_MAX);
    m_graphWidget->setAxisTitle(QwtPlot::yLeft, tr("Y"));
    m_graphWidget->setAxisScale(QwtPlot::yLeft, DEFAULT_Y_MIN, DEFAULT_Y_MAX);

    QwtPlotZoomer* zoomer = new QwtPlotZoomer(m_graphWidget->canvas());
    zoomer->setTrackerMode(QwtPlotZoomer::AlwaysOn);
    zoomer->setMousePattern(QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier);
    zoomer->setMousePattern(QwtEventPattern::MouseSelect3, Qt::RightButton);

    // path label
    m_label= new QLabel();
    m_label->setTextFormat(Qt::RichText);
    m_label->setWordWrap(false);
    m_label->setText(tr("<b>Label: </b>"));

    // splitter
    m_splitter = new QSplitter();
    m_splitter->setChildrenCollapsible(true);
    m_list = new QListWidget();
    m_splitter->addWidget(m_list);
    m_tree = new QTreeWidget();
    m_splitter->addWidget(m_tree);
    m_text = new QTextEdit();
    m_splitter->addWidget(m_text);
    m_splitter->addWidget(m_graphWidget);

    // page layout
    QVBoxLayout *pageLayout = new QVBoxLayout(this);
    pageLayout->addWidget(m_label);
    pageLayout->addWidget(m_splitter);
    setLayout(pageLayout);
}

[...]

m_mainWindow = new MyWindow(this);
m_mainWindow->show();
2个回答

1

您需要通过调用 setCentralWidget() 来设置一个中心小部件。

编辑:向主窗口添加一个 QWidget,将其设置为中心小部件,创建布局,最后将其添加到中心小部件中。

MyWindow::MyWindow(IViewSignalHandler* signalHandler, QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
  QWidget *ui_area = new QWidget;
  setCentralWidget(ui_area);

  //.....create your_layout.....

 ui_area->setLayout(your_layout);

}

我尝试过各种组合,但都不起作用。例如,如果我在构造函数中添加this->setCentralWidget(pageLayout->widget())作为最后一行,则会在菜单栏上方绘制迷你拆分器。 - Galadrius Krunthar
如果我尝试使用 this->setCentralWidget(m_splitter);,看起来会好得多 - 然后我会得到一个漂亮的菜单栏,下面是一个大的分割器,它随着窗口的大小而调整大小,但是这样我就使用了标签,该标签应该位于菜单栏和分割器之间(这就是为什么我在那里使用垂直布局的原因)。 - Galadrius Krunthar
如果我从 QMainWindow 切换到 QDialog,一切都正常工作。 - Galadrius Krunthar
-1:QLayout 不是 QWidget。在这种情况下,setCentralWidget() 不适用。 - ShdNx

1

我刚刚遇到了完全相同的问题。我不知道是什么原因导致的,但是继承自QWidget而不是QMainWindow似乎已经解决了这个问题。


qmainwindow需要用户设置centralWidget,否则它将不会显示任何内容。http://qt-project.org/doc/qt-4.8/qmainwindow.html#setCentralWidget - Validus Oculus
使用QWidget继承对我很有帮助。谢谢。 - Phlox Midas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接