Виджеты Qt не отображаются в главном окне - PullRequest
4 голосов
/ 21 марта 2012

Я пытаюсь создать главное окно приложения. Он должен иметь строку меню и показывать одну метку с разделителем внизу. Мой код для главного окна ниже.

Проблема в том, что строка меню показывает, а метка и сплиттер - нет. Вещи, которые я пробовал до сих пор: 1. Установите родителя сплиттера в «this» -> показ сплиттера, но он рисуется поверх строки меню и имеет небольшой размер. 2. Установите родительский ярлык на «this» -> label показывает, но рисуется поверх строки меню. 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 голос
/ 30 мая 2013

У меня точно такая же проблема. Я не знаю, что вызвало это, но наследование от QWidget вместо QMainWindow, похоже, исправило это.

1 голос
/ 21 марта 2012

Вам нужно установить центральный виджет, вызвав 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);

}
...