Qt добавить menuBar, меню и подменю в QMainWindow

Всех поздравляет,

Мне трудно добавить строку меню, меню и подменю в Qt QMainWindow, используя коды.

Следующий код выполняется с выдачей ошибки:

QWidget :: setLayout: Попытка установить QLayout «» на QMainWindow «», который уже имеет макет

Заметки :
*. Главное окно выходит без какого-либо меню или макета (пусто!)

#include <QApplication>

#include <QApplication>
#include<QSlider>
#include<QSpinBox>
#include<QHBoxLayout>
#include<QWidget>

#include "mainwindow.h"#include<QMenuBar>
#include<QStatusBar>

int main(int argc, char *argv[])
{

QApplication a(argc, argv);

QMenuBar *menu = new QMenuBar;
QMenu *file = new QMenu();
file->addMenu("&File");
menu->addMenu(file);

QSlider *s1 = new QSlider(Qt::Horizontal);
QSlider *s2 = new QSlider(Qt::Vertical);
QSpinBox *sb = new QSpinBox;QHBoxLayout *L = new QHBoxLayout;
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);QMainWindow *w = new QMainWindow;
w->setLayout(L);
w->show();

return a.exec();
}

1

Решение

добавить макет в центральный виджет:

#include <QApplication>

#include <QApplication>
#include<QSlider>
#include<QSpinBox>
#include<QHBoxLayout>
#include<QWidget>

#include<QMenuBar>
#include<QStatusBar>
#include <QMainWindow>

int main(int argc, char *argv[])
{

QApplication a(argc, argv);

QMainWindow *w = new QMainWindow;

QMenuBar *menu = new QMenuBar;
QMenu *file = new QMenu();
file->addMenu("&File");
menu->addMenu(file);

QWidget *centralwidget = new QWidget(w);
w->setCentralWidget(centralwidget);

QSlider *s1 = new QSlider(Qt::Horizontal, centralwidget);
QSlider *s2 = new QSlider(Qt::Vertical, centralwidget);
QSpinBox *sb = new QSpinBox;QHBoxLayout *L = new QHBoxLayout(centralwidget);
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);
w->show();

return a.exec();
}

введите описание изображения здесь

1

Другие решения

каждый QMainWindow должен иметь центральный виджет:

QMainWindow *w = new QMainWindow;

QWidget* centralWidget = new QWidget;
w->setCentralWidget( centralWidget );

centralWidget->setLayout(L);
w->show();
0

Это финальная версия

#include <QApplication>

#include <QApplication>
#include<QSlider>
#include<QSpinBox>
#include<QHBoxLayout>
#include<QWidget>

#include "mainwindow.h"#include<QMenuBar>
#include<QStatusBar>

int main(int argc, char *argv[])
{

QApplication a(argc, argv);QSlider *s1 = new QSlider(Qt::Horizontal);
QSlider *s2 = new QSlider(Qt::Vertical);
QSpinBox *sb = new QSpinBox;QMainWindow *w = new QMainWindow;

QWidget *cw = new QWidget(w);

QMenuBar *menu = new QMenuBar(cw);QHBoxLayout *L = new QHBoxLayout(cw);
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);

QMenu *file = new QMenu("&File");
file->addMenu("Open");
file->addMenu("new");

QMenu *Build = new QMenu("&Build");
Build->addAction("Rebuild this file");
Build->addAction("Rebuild All");

menu->addMenu(file);
menu->addMenu(Build);

w->setCentralWidget(cw);

w->show();QObject::connect  (s1,SIGNAL(valueChanged(int) ),  sb,SLOT(setValue(int) )   );
QObject::connect  (s1,SIGNAL(valueChanged(int) ),  s2,SLOT(setValue(int) )   );

QObject::connect  (s2,SIGNAL(valueChanged(int) ),  sb,SLOT(setValue(int) )   );
QObject::connect  (s2,SIGNAL(valueChanged(int) ),  s1,SLOT(setValue(int) )   );

QObject::connect  (sb,SIGNAL(valueChanged(int) ),  s1,SLOT(setValue(int) )    );
QObject::connect  (sb,SIGNAL(valueChanged(int) ),  s2,SLOT(setValue(int) )    );

return a.exec();}
0
По вопросам рекламы [email protected]