第七章窗口类
1. QMainWindow
1.1 菜单栏
#include <QMenuBar>
QMenuBar* menubar = menuBar();
if (menubar == nullptr)
qInfo() << "窗口本来没有菜单栏";
else
qInfo() << "有菜单栏"; // 运行后发现窗口本来就有菜单栏,不用自己new
auto* fileMenu = new QMenu("文件");
menubar->addMenu(fileMenu);
fileMenu->addAction("打开文件"); // 添加一个文本菜单
fileMenu->addAction(QIcon(R"(C:\Users\PVer\Pictures\Resource\xiaoku.png)"), "表情"); // 添加一个带icon的菜单
connect(fileMenu, &QMenu::triggered, [](QAction* act) { qInfo() << act->text(); }); // 选中哪个菜单,输出菜单对应文本
// 也可以直接添加QAction
QAction* action = new QAction("退出");
fileMenu->addAction(action);
connect(action, &QAction::triggered, [=] { qInfo() << action->text(); });
// 给菜单添加快捷键
menubar->addMenu("编辑(&E)");
menubar->addAction("&undo");
// 添加分割符
fileMenu->addSeparator();
fileMenu->insertSeparator(action); // 指定在action前面添加分隔符
// 菜单套娃
QMenu* projectMenu = new QMenu("最近使用的项目");
projectMenu->addAction("object1");
projectMenu->addAction("object2");
fileMenu->addMenu(projectMenu); // 之前设置的信号与槽也会触发
1.2 工具栏
#include <QCheckBox>
#include <QPushButton>
#include <QStyle>
#include <QToolBar>
// 创建工具栏
QToolBar* toolBar = addToolBar("工具栏");
// 设置内容,Icon
toolBar->addAction(QIcon(R"(C:\Users\PVer\Pictures\Resource\xiaoku.png)"), "构建");
// 也可以设置系统提供的标准icon
toolBar->addAction(style()->standardIcon(QStyle::SP_DirIcon), "标准icon");
// 可以给工具栏添加继承自QWidget的按钮
toolBar->addWidget(new QPushButton("PushButton"));
toolBar->addWidget(new QCheckBox("CheckBo x"));
// 连接信号与槽
connect(toolBar, &QToolBar::actionTriggered, [](QAction* act) { qInfo() << act->text(); });
1.3 状态栏
#include <QToolBar>
// 状态栏
auto statBar = this->statusBar();
// statBar->showMessage("程序已启动");//在窗口最下方statusbar的位置显示"程序已启动";
// 可以给状态栏添加按钮
statBar->addWidget(new QPushButton("按钮")); // 可能会被消息覆盖,有showMessage就不显示
statBar->insertPermanentWidget(0, new QCheckBox("状态栏")); // 不会被覆盖,在右下角,0是添加控件的索引
statBar->addPermanentWidget(new QPushButton("按钮2")); // 在后面添加,索引往后排
connect(statBar, &QStatusBar::messageChanged, [=](QString message) { qInfo() << message; });
1.4 浮动窗口
#include <QDockWidget>
// 停靠窗口
auto dockWd = new QDockWidget("欢迎");
auto dockWd2 = new QDockWidget("编辑");
auto dockWd3 = new QDockWidget("帮助");
auto dockWd4 = new QDockWidget("项目");
auto dockWd5 = new QDockWidget("调试");
addDockWidget(Qt::LeftDockWidgetArea, dockWd, Qt::Horizontal); // 左边添加停靠窗口,水平排列
addDockWidget(Qt::RightDockWidgetArea, dockWd2, Qt::Vertical);
addDockWidget(Qt::TopDockWidgetArea, dockWd3);
addDockWidget(Qt::BottomDockWidgetArea, dockWd4);
addDockWidget(Qt::AllDockWidgetAreas, dockWd5);
resize(1280, 720);
// 添加个中心控件,方便查看效果
QPushButton* centerBtn = new QPushButton("中心区域");
setCentralWidget(centerBtn); // 把按钮设置到窗口中心区域
splitDockWidget(dockWd, dockWd2, Qt::Vertical); // 设置2个窗口之间垂直分隔符
splitDockWidget(dockWd3, dockWd4, Qt::Horizontal);
// 改成选项卡模式
tabifyDockWidget(dockWd, dockWd5);
2. 菜单
2.1 右键菜单
//.h文件
QT_BEGIN_NAMESPACE
class QMenu;
QT_END_NAMESPACE
public slots:
void showMenu(QPoint pos);
private:
void initMenu();
private:
QMenu* menu;
//.cpp
#include <QMenu>
void MainWindow::showMenu(QPoint pos)
{
QPoint globalPos = mapToGlobal(pos); // 把小部件的坐标转换成全局坐标
// globalPos = QCursor::pos();// 也可以设置当前鼠标坐标
menu->popup(globalPos); // 显示菜单,在指定的全局坐标位置显示
}
void MainWindow::initMenu()
{
menu = new QMenu;
menu->addAction("复制");
menu->addAction("剪切");
menu->addAction("删除");
menu->addAction("打开");
connect(menu, &QMenu::triggered, [=](QAction* action) {
qInfo() << action->text();
});
}
// 右键菜单
initMenu();
connect(this, &MainWindow::customContextMenuRequested, this, &MainWindow::showMenu);//连接信号与槽
2.2 托盘菜单
void initTrayIcon();
QSystemTrayIcon* tray;
void MainWindow::initTrayIcon()
{
tray = new QSystemTrayIcon(this);
tray->setIcon(QIcon(R"(C:\Users\PVer\Pictures\Resource\派蒙.jpeg)"));
tray->setVisible(true); // 如果不设置Icon,这个无效,默认看不见
tray->setContextMenu(menu); // 也可以给托盘设置菜单
menu->addAction("显示");
menu->addAction("隐藏");
connect(menu, &QMenu::triggered, [=](QAction* action) {
if (action->text() == "显示") {
show();
// 气泡消息
if (QSystemTrayIcon::supportsMessages()) {
tray->showMessage("提示", "窗口已打开", QSystemTrayIcon::Information);
}
}
if (action->text() == "隐藏") {
hide();
// 气泡消息
if (QSystemTrayIcon::supportsMessages()) {
tray->showMessage("警告", "窗口隐藏", QIcon(R"(C:\Users\PVer\Pictures\Resource\派蒙.jpeg)"));
}
}
});
// 可以设置tips
tray->setToolTip("原神,启动!");
// 连接托盘的信号与槽
connect(tray, &QSystemTrayIcon::activated, [=](QSystemTrayIcon::ActivationReason reason) {
switch (reason) {
case QSystemTrayIcon::Unknown:
qInfo() << "未知原因";
break;
case QSystemTrayIcon::Context:
qInfo() << "请求上下文";
break;
case QSystemTrayIcon::DoubleClick:
qInfo() << "双击";
break;
case QSystemTrayIcon::Trigger:
qInfo() << "单击";
break;
case QSystemTrayIcon::MiddleClick:
qInfo() << "中键点击";
break;
default:
break;
}
});
}