菜单栏是GUI应用程序的常见部分。它是位于各个地方的一组命令,称为菜单。菜单组命令,我们可以在应用程序中使用它们。工具栏提供了对最常用命令的快速访问。
简单菜单
// simplemenu.h
#pragma once
#include <QMainWindow>
#include <QApplication>
class SimpleMenu : public QMainWindow {
public:
SimpleMenu(QWidget *parent = 0);
};
// simplemenu.cpp
#include "simplemenu.h"
#include <QMenu>
#include <QMenuBar>
SimpleMenu::SimpleMenu(QWidget *parent)
: QMainWindow(parent) {
// 此行创建一个QAction,每个QMenu都有一个或多个动作对象。
QAction *quit = new QAction("&Quit", this);
// 创建QMenu对象
QMenu *file;
file = menuBar()->addMenu("&File");
// 使用addAction()方法在菜单内放置一个动作
file->addAction(quit);
// 当从菜单中选择此选项时,应用程序退出。
connect(quit, &QAction::triggered, qApp, QApplication::quit);
}
// main.cpp
#include "simplemenu.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
SimpleMenu window;
window.resize(250, 150);
window.setWindowTitle("Simple menu");
window.show();
return app.exec();
}
有一个菜单栏,一个菜单和一个动作。为了使用菜单,我们必须从QMainWindow
部件继承。
图标,快捷键和分隔符
在下面的例子中,将进一步增强上一个应用程序,为菜单添加图标,使用快捷键和分隔符。
// anothermenu.h
#pragma once
#include <QMainWindow>
#include <QApplication>
class AnotherMenu : public QMainWindow {
public:
AnotherMenu(QWidget *parent = 0);
};
// anothermenu.cpp
#include "anothermenu.h"
#include <QMenu>
#include <QMenuBar>
AnotherMenu::AnotherMenu(QWidget *parent)
: QMainWindow(parent) {
// 这些是在菜单中使用的图像。请注意,某些桌面环境可能不会在菜单中显示图像。
QPixmap newpix("new.png");
QPixmap openpix("open.png");
QPixmap quitpix("quit.png");
// 在此代码中,使用带有pixmap的QAction构造函数作为第一个参数。
QAction *newa = new QAction(newpix, "&New", this);
QAction *open = new QAction(openpix, "&Open", this);
QAction *quit = new QAction(quitpix, "&Quit", this);
// 这里创建一个键盘快捷键。通过按这个快捷键,将运行退出操作,退出应用程序。
quit->setShortcut(tr("CTRL+Q"));
QMenu *file;
file = menuBar()->addMenu("&File");
file->addAction(newa);
file->addAction(open);
// 创建一个分隔符。分隔符是一条水平线,它使菜单操作分组到一些逻辑组中。
file->addSeparator();
file->addAction(quit);
// 在某些环境下,菜单图标默认不显示。
// 在这种情况下,可以禁用Qt::AA_DontShowIconsInMenus属性。
qApp->setAttribute(Qt::AA_DontShowIconsInMenus, false);
connect(quit, &QAction::triggered, qApp, &QApplication::quit);
}
在这个例子中,有一个包含三个动作的菜单。只有退出动作才真正有用。我们还创建了一个分隔符和一个CTRL+Q
快捷键,它终止了应用程序。
// main.cpp
#include "anothermenu.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AnotherMenu window;
window.resize(350, 200);
window.setWindowTitle("Another menu");
window.show();
return app.exec();
}
可选菜单
在下一个例子中,将创建一个可选的菜单。这将是一个带有复选框的操作。该选项切换状态栏的可见性。
// checkable.h
#pragma once
#include <QMainWindow>
#include <QApplication>
class Checkable : public QMainWindow {
Q_OBJECT
public:
Checkable(QWidget *parent = 0);
private slots:
void toggleStatusbar();
private:
QAction *viewst;
};
// checkable.cpp
#include "checkable.h"
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>
Checkable::Checkable(QWidget *parent)
: QMainWindow(parent) {
// 创建一个动作,并使setCheckable()方法。
// setCheckable()方法会让这个动作可选。
viewst = new QAction("&View statusbar", this);
viewst->setCheckable(true);
viewst->setChecked(true);
QMenu *file;
file = menuBar()->addMenu("&File");
file->addAction(viewst);
statusBar();
connect(viewst, &QAction::triggered, this, &Checkable::toggleStatusbar);
}
void Checkable::toggleStatusbar() {
// 在toggleStatusbar()方法内部,确定菜单项是否被选中,并相应地隐藏或显示状态条。
if (viewst->isChecked()) {
statusBar()->show();
} else {
statusBar()->hide();
}
}
// main.cpp
#include "checkable.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Checkable window;
window.resize(250, 150);
window.setWindowTitle("Checkable menu");
window.show();
return app.exec();
}
QToolBar
QToolBar
类提供了一个可移动面板,其中包含一组控件,用于快速访问应用程序。
// toolbar.h
#pragma once
#include <QMainWindow>
#include <QApplication>
class Toolbar : public QMainWindow {
Q_OBJECT
public:
Toolbar(QWidget *parent = 0);
};
// toolbar.cpp
#include "toolbar.h"
#include <QToolBar>
#include <QIcon>
#include <QAction>
Toolbar::Toolbar(QWidget *parent)
: QMainWindow(parent) {
QPixmap newpix("new.png");
QPixmap openpix("open.png");
QPixmap quitpix("quit.png");
// addToolBar()方法创建一个工具栏并返回一个指向它的指针。
QToolBar *toolbar = addToolBar("main toolbar");
// 在工具栏中添加两个动作和一个分隔符。
toolbar->addAction(QIcon(newpix), "New File");
toolbar->addAction(QIcon(openpix), "Open File");
toolbar->addSeparator();
QAction *quit = toolbar->addAction(QIcon(quitpix),
"Quit Application");
connect(quit, &QAction::triggered, qApp, &QApplication::quit);
}
从QMainWindow
部件继承,创建一个工具栏.
// main.cpp
#include "toolbar.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Toolbar window;
window.resize(300, 200);
window.setWindowTitle("QToolBar");
window.show();
return app.exec();
}
应用框架
在这部分的最后,创建了一个应用程序框架。该示例主要基于QMainWindow
控件。
// skeleton.h
#pragma once
#include <QMainWindow>
#include <QApplication>
class Skeleton : public QMainWindow {
Q_OBJECT
public:
Skeleton(QWidget *parent = 0);
};
// skeleton.cpp
#include "skeleton.h"
#include <QToolBar>
#include <QIcon>
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>
#include <QTextEdit>
Skeleton::Skeleton(QWidget *parent)
: QMainWindow(parent) {
QPixmap newpix("new.png");
QPixmap openpix("open.png");
QPixmap quitpix("quit.png");
QAction *quit = new QAction("&Quit", this);
QMenu *file;
file = menuBar()->addMenu("&File");
file->addAction(quit);
connect(quit, &QAction::triggered, qApp, &QApplication::quit);
QToolBar *toolbar = addToolBar("main toolbar");
toolbar->addAction(QIcon(newpix), "New File");
toolbar->addAction(QIcon(openpix), "Open File");
toolbar->addSeparator();
QAction *quit2 = toolbar->addAction(QIcon(quitpix),
"Quit Application");
connect(quit2, &QAction::triggered, qApp, &QApplication::quit);
// 创建一个 QTextEdit控件并将其放置到QMainWindow控件的中心部分。
QTextEdit *edit = new QTextEdit(this);
setCentralWidget(edit);
statusBar()->showMessage("Ready");
}
这里创建一个菜单工具栏和一个状态栏。
// main.cpp
#include "skeleton.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Skeleton window;
window.resize(350, 250);
window.setWindowTitle("Application skeleton");
window.show();
return app.exec();
}