Qt第七章窗口类

发布于:2024-04-17 ⋅ 阅读:(23) ⋅ 点赞:(0)

第七章窗口类

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;
        }
    });
}