C++ Qt将菜单栏、菜单和子菜单添加到QMainWindow
我很难通过编程方式将菜单栏、菜单和子菜单添加到QtQmainWindow 以下代码产生错误: QWidget::setLayout:正在尝试在QMainWindow“”上设置QLayout“”,该窗口已具有布局 注: *。主窗口显示时没有任何菜单或布局(空!)C++ Qt将菜单栏、菜单和子菜单添加到QMainWindow,c++,qt,qt5,qmainwindow,qmenubar,C++,Qt,Qt5,Qmainwindow,Qmenubar,我很难通过编程方式将菜单栏、菜单和子菜单添加到QtQmainWindow 以下代码产生错误: QWidget::setLayout:正在尝试在QMainWindow“”上设置QLayout“”,该窗口已具有布局 注: *。主窗口显示时没有任何菜单或布局(空!) #包括 #包括 #包括 #包括 #包括 #包括 #包括“mainwindow.h” #包括 #包括 int main(int argc,char*argv[]) { 质量保证申请a(argc、argv); QMenuBar*菜单=新的QM
#包括
#包括
#包括
#包括
#包括
#包括
#包括“mainwindow.h”
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QMenuBar*菜单=新的QMenuBar;
QMenu*文件=新的QMenu();
文件->添加菜单(“&file”);
菜单->添加菜单(文件);
QSlider*s1=新的QSlider(Qt::水平);
QSlider*s2=新的QSlider(Qt::垂直);
QSpinBox*sb=新QSpinBox;
QHBoxLayout*L=新的QHBoxLayout;
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);
QMainWindow*w=新的QMainWindow;
w->设置布局(L);
w->show();
返回a.exec();
}
每个QMainWindow
都应该有一个中心小部件:
QMainWindow *w = new QMainWindow;
QWidget* centralWidget = new QWidget;
w->setCentralWidget( centralWidget );
centralWidget->setLayout(L);
w->show();
#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();
}
将布局添加到中心小部件:
QMainWindow *w = new QMainWindow;
QWidget* centralWidget = new QWidget;
w->setCentralWidget( centralWidget );
centralWidget->setLayout(L);
w->show();
#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();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QMainWindow*w=新的QMainWindow;
QMenuBar*菜单=新的QMenuBar;
QMenu*文件=新的QMenu();
文件->添加菜单(“&file”);
菜单->添加菜单(文件);
QWidget*centralwidget=新的QWidget(w);
w->setCentralWidget(centralwidget);
QSlider*s1=新的QSlider(Qt::水平,中心Widget);
QSlider*s2=新的QSlider(Qt::垂直,中心Widget);
QSpinBox*sb=新QSpinBox;
QHBoxLayout*L=新的QHBoxLayout(centralwidget);
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);
w->show();
返回a.exec();
}
这是最终版本
#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();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括“mainwindow.h”
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QSlider*s1=新的QSlider(Qt::水平);
QSlider*s2=新的QSlider(Qt::垂直);
QSpinBox*sb=新QSpinBox;
QMainWindow*w=新的QMainWindow;
QWidget*cw=新的QWidget(w);
QMenuBar*菜单=新的QMenuBar(cw);
QHBoxLayout*L=新的QHBoxLayout(cw);
L->addWidget(s1);
L->addWidget(s2);
L->addWidget(sb);
QMenu*file=新的QMenu(“&file”);
文件->添加菜单(“打开”);
文件->添加菜单(“新建”);
QMenu*Build=新QMenu(“&Build”);
Build->addAction(“重建此文件”);
构建->添加操作(“全部重建”);
菜单->添加菜单(文件);
菜单->添加菜单(构建);
w->setCentralWidget(cw);
w->show();
QObject::connect(s1,信号(值更改(int)),sb,插槽(设置值(int));
QObject::connect(s1,信号(值更改(int)),s2,插槽(设置值(int));
QObject::connect(s2,信号(值更改(int)),sb,插槽(设置值(int));
QObject::connect(s2,信号(值更改(int)),s1,插槽(设置值(int));
QObject::connect(sb,信号(值更改(int)),s1,插槽(设置值(int));
QObject::connect(sb,信号(值更改(int)),s2,插槽(设置值(int));
返回a.exec();
}
为了尝试清楚地回答标题所建议的问题(这本身不是一个问题),QMainWindow
在默认情况下已经有一个空的菜单栏,还有其他类似于中心小部件的功能
要访问此QMenuBar
并用您选择的内容填充它,只需从QMainWindow
实例调用menuBar()
。
要将子菜单添加到QMenuBar
,请使用QMenuBar::addMenu
例如:
QAction* newAct = new QAction("save");
auto fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);
auto submenu = fileMenu->addMenu("Submenu");
submenu->addAction(new QAction("action1");
submenu->addAction(new QAction("action2");
有关更多信息,请看这个Qt示例:还有
QMenuBar
reference,不幸的是,我曾经使用Qt designer创建菜单,这非常简单和快速。然而,我将很快有一个考试,可能会要求写在纸上的代码!如果有更简单的方法,请告诉我。为什么要设置QMainWindow
的布局?你到底想达到什么目的?如果您想在QMainWindow
的上下文中实现某些功能,您通常会在从QWidget
派生的类中实现该功能,然后将指向该类实例的指针传递给@G.M。谢谢,我已经解决了这个问题。为了澄清一下,我曾经使用QWidget而不是QMainWindow,它可以正常工作,但我无法添加菜单栏