在这部分Qt5 C++编程教程中,讨论Qt5应用程序中菜单和工具栏。
一个菜单栏是一个GUI程序的常见部分。它是位于称为菜单的各种位置中的命令组。工具栏提供了对最常用命令的快速访问。
1) Qt5简单菜单
第一个例子展示显示一个简单菜单。以下是源代码,我们有一个菜单栏,菜单和一个操作。为了使用菜单,我们必须从一个QMainWindow部件继承。
/* simple_menu.h 头文件内容 */
#ifndef SIMPLE_MENU_H
#define SIMPLE_MENU_H
#include <QMainWindow>
#include <QApplication>
class simple_menu : public QMainWindow
{
public:
simple_menu(QWidget * parent = nullptr);
};
#endif // SIMPLE_MENU_H
/* simple_menu.cpps实现代码 */
#include "simple_menu.h"
#include <QMenu>
#include <QMenuBar>
simple_menu::simple_menu(QWidget * parent) :QMainWindow(parent)
{
// 此代码行创建了一个QAction。每个QMenu有以下一个或多个action对象
auto * quit = new QAction("&Quit", this);
// 创建一个QMenu对象。
QMenu * file = menuBar()->addMenu("&File");
// 使用addAction方法将一个action放入菜单中
file->addAction(quit);
// 当从菜单选择这个选项时,程序退出。
connect(quit, &QAction::triggered, qApp, QApplication::quit);
}
/* 主程序main.cpp内容 */
#include <QApplication>
#include <QMainWindow>
#include "simple_menu.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
simple_menu window;
window.resize(350, 250);
window.setWindowTitle("Simpe Menu");
window.show();
return a.exec();
}
项目文件pro描述:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
CONFIG += c++11
TARGET = firstmenu
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
simple_menu.cpp
HEADERS += \
simple_menu.h
编译并且执行以上程序:
2) Qt5图标,快捷方式和分隔符
在以下示例中,我们进一步增强前面的程序。我们添加图标到菜单,使用快捷方式和分隔符。在本例中,创建了三个actions菜单。在我们选择它时,仅quit action将实际做事情。也创建了一个分隔符和一个终止程序的CTRL+Q快捷方式。
以下是源代码:
/* 头文件 */
#ifndef ANOTHERMENU_H
#define ANOTHERMENU_H
#include <QMainWindow>
#include <QApplication>
#include <QWidget>
class AnotherMenu : public QMainWindow
{
public:
AnotherMenu(QWidget * parent = nullptr);
};
#endif // ANOTHERMENU_H
/* 实现文件 */
#include "anothermenu.h"
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QPixmap>
AnotherMenu::AnotherMenu(QWidget * parent)
:QMainWindow(parent)
{
// 这些是我们在菜单中使用的图像。注意:某些桌面环境不在菜单中显示图像。
QPixmap newpix("png/1.PNG");
QPixmap openpix("png/2.PNG");
QPixmap quitpix("png/3.png");
// 使用pixmap作为第一个参数的QAction构造器。
auto * newa = new QAction(newpix, "&New", this);
auto * open = new QAction(openpix, "&Open", this);
auto * quit = new QAction(quitpix, "&Quit", this);
// 创建快捷方式。按下这个快捷键,将运行终止程序的quit action。
quit->setShortcut(tr("CTRL+Q"));
QMenu *file = menuBar()->addMenu("&File");
file->addAction(newa);
file->addAction(open);
// 创建一个分隔符。此分隔符是水平线,它使我们把菜单actions分成某些逻辑组。
file->addSeparator();
file->addAction(quit);
// 在某些环境中,菜单图标默认不显示。在这种情况中,可以禁用Qt::AA_DontShowIconsInMenus属性。
qApp->setAttribute(Qt::AA_DontShowIconsInMenus, false);
connect(quit, &QAction::triggered, qApp, &QApplication::quit);
}
/* 主程序main.cpp */
#include <QApplication>
#include "anothermenu.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AnotherMenu window;
window.resize(350,250);
window.setWindowTitle("Another menu");
window.show();
return a.exec();
}
项目文件pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
CONFIG += c++11
TARGET = anothermenu
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
anothermenu.cpp
HEADERS += \
anothermenu.h
DISTFILES += \
png/1.PNG \
png/2.PNG \
png/3.PNG
编译并且执行以上程序:
3) Qt5可复选菜单
在本例中,创建一个复选菜单。这是一个有复选框的action。这个选项切换状态栏可见性。
/* 头文件 */
#ifndef CHECKABLE_H
#define CHECKABLE_H
#include <QMainWindow>
#include <QApplication>
#include <QAction>
class Checkable : public QMainWindow
{
Q_OBJECT
public:
explicit Checkable(QWidget *parent = 0);
signals:
private slots:
void toggleStatusbar();
private:
QAction * viewst;
public slots:
};
/* 实现文件 */
#include "checkable.h"
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>
Checkable::Checkable(QWidget *parent) : QMainWindow(parent)
{
// 创建一个action并且用setCheckable方法使它可复选。
// setChecked方法复选它。
viewst = new QAction("&View statusbar", this);
viewst->setCheckable(true);
viewst->setChecked(true);
QMenu * file = menuBar()->addMenu("&File");
file->addAction(viewst);
statusBar()->show();
connect(viewst, &QAction::triggered, this, &Checkable::toggleStatusbar);
}
// 在toggleStatusbar方法中,我们决定是否选取菜单项并且相应的隐藏或显示状态栏
void Checkable::toggleStatusbar()
{
if (viewst->isChecked()){
printf("checked!\n");
statusBar()->show();
}
else{
statusBar()->hide();
printf("unchecked!\n");
}
}
/* 主程序 */
#include <QApplication>
#include "checkable.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Checkable window;
window.resize(350, 250);
window.setWindowTitle("Checkable Window");
window.show();
return a.exec();
}
4)Qt5 QToolBar
QToolBar类提供了一个可移动面板,它包含一个控件集合,它们提供对应用程序action的快速访问。
源代码如下:
/* 头文件 */
#ifndef TOOLBAR_H
#define TOOLBAR_H
#include <QMainWindow>
#include <QApplication>
class ToolBar : public QMainWindow
{
Q_OBJECT
public:
explicit ToolBar(QWidget *parent = 0);
signals:
public slots:
};
#endif // TOOLBAR_H
/* 实现文件 */
#include "toolbar.h"
#include <QToolBar>
#include <QIcon>
#include <QAction>
// 创建一个工具栏,从QMainWidnow部件继承
ToolBar::ToolBar(QWidget *parent) : QMainWindow(parent)
{
QPixmap newpix("png/1.PNG");
QPixmap openpix("png/2.PNG");
QPixmap quitpix("png/3.PNG");
// addToolBar方法创建一个工具栏并且返回一个指向它的指针
QToolBar * toolbar = addToolBar("main toolbar");
// 我们在这里添加了两个action和一个分隔符到这个工具栏
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);
}
/* 主程序 */
#include <QApplication>
#include "toolbar.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ToolBar window;
window.resize(350, 250);
window.setWindowTitle("QToolBar Window");
window.show();
return a.exec();
}
项目文件:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
CONFIG += c++11
TARGET = toolbar
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
toolbar.cpp
HEADERS += \
toolbar.h
DISTFILES += \
png/1.PNG \
png/2.PNG \
png/3.PNG
编译执行以上文件:
5) Qt5程序框架
在本例中,我们创建了一个程序框架。这个示例主要基于QMainWindow部件。在此创建了一个工具栏和一个状态栏。
源代码:
/* 头文件 */
#ifndef SKELETON_H
#define SKELETON_H
#include <QMainWindow>
class Skeleton : public QMainWindow
{
Q_OBJECT
public:
explicit Skeleton(QWidget *parent = 0);
signals:
public slots:
};
/* 实现文件 */
#include "skeleton.h"
#include <QMainWindow>
#include <QApplication>
#include <QWidget>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QTextEdit>
#include <QStatusBar>
#include <QIcon>
#include <QAction>
Skeleton::Skeleton(QWidget *parent) : QMainWindow(parent)
{
QPixmap newpix("png/1.PNG");
QPixmap openpix("png/2.PNG");
QPixmap quitpix("png/3.PNG");
auto * quit = new QAction("&Quit", this);
QMenu * 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部件的中心部分 */
auto * edit = new QTextEdit(this);
setCentralWidget(edit);
statusBar()->showMessage("Ready");
}
/* 主程序 */
#include <QApplication>
#include "skeleton.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Skeleton window;
window.resize(350,250);
window.setWindowTitle("Skeleton Window");
window.show();
return a.exec();
}
编译并且运行以上程序: