zoukankan      html  css  js  c++  java
  • 4_MainWindows.md

    MainWindows

    主窗口

    Qt Main Window Framework

    img

    ​ 通常,各个图形界面框架都会使用操作系统本地代码来生成一个窗口。所以,你会看到在 KDE 上面,主窗口的标题栏是 KDE 样式的;在 Windows 平台上,标题栏是 Windows 风格的。如果你不喜欢本地样式,比如 QQ 这种,它其实是自己将标题栏绘制出来,这种技术称为 DirectUI,也就是无句柄绘制

    • Toolbars :显示工具条区域。Qt 的主窗口支持多个工具条。
      你可以将工具条拖放到不同的位置
    • Central Widget: 程序最主要的工作区域放置在这里

    ​ 通常我们的程序主窗口会继承自 QMainWindow,以便获得 QMainWindow 提供的各种便利的函数。这也是 Qt Creator 生成的代码所做的。

    QAction

    ​ QAction 对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。

    ​ QAction 包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。当把一个 QAction对象添加到程序中时,Qt 自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把 QAction 对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了 QAction 的图标,那么在工具栏上面这个 QAction 所对应的按钮的图标也会同步修改。

    // mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    private:
        void open();
    
        QAction *openAction;
    };
    
    #endif // MAINWINDOW_H
    
    // main.cpp
    #include "mainwindow.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    
    // mainwindow.cpp
    #include "mainwindow.h"
    
    #include <QAction>
    #include <QMenuBar>
    #include <QMessageBox>
    #include <QToolBar>
    #include <QStatusBar>
    #include <QIcon>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        setWindowTitle(tr("Main Window"));
    
        openAction = new QAction(QIcon(":/images/doc-open"), tr("Open..."), this);
        openAction->setShortcut(QKeySequence::Open);
        openAction->setStatusTip(tr("Open an existing file"));
        connect(openAction, &QAction::triggered, this, &MainWindow::open);
    
        QMenu *file = menuBar()->addMenu(tr("&File"));
        file->addAction(openAction);
    
        QToolBar *toolBar = addToolBar(tr("&File"));
        toolBar->addAction(openAction);
    
        statusBar();
    }
    
    MainWindow::~MainWindow()
    {
    }
    
    void MainWindow::open() {
        QMessageBox::information(this, tr("Information"), tr("Open"));
    }
    

    ​ 注意我们的文本使用 tr()函数,这是一个用于 Qt 国际化的函数。在后续章节中我们可以看到,我们可以使用 Qt 提供的国际化工具,将 tr()函数的字符串提取出来,进行国际化。由于所需进行国际化的文本应该被大多数人认识,所以,tr()函数里面一般会是英文文本。

    ​ 图标我们使用了 QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。Qt 资源文件的后缀名是 qrc。如果我们使用 Qt Creator,我们可以在新建文件中看到Qt 资源文件。Qt 资源文件其实是一个 XML 描述的文件,表示 Qt 应用程序所需要的各个资源。我们可以使用普通文本编辑器打开这个文件。

    ​ QAction 第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。注意看截图中 File 的 F 有一个下划线。

    ​ 我们使用了 setShortcut()函数,用于说明这个 QAction 的快捷键。Qt 的
    QKeySequence 为我们定义了很多内置的快捷键,比如我们使用的 Open。你可以通过查阅 API 文档获得所有的快捷键列表。 这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个 tr("Ctrl+O")来实现快捷键。原因在于,这是 Qt 跨平台性的体现。比如 PC 键盘和 Mac 键盘是不一样的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用 QKeySequence 类来添加快捷键,会根据平台的不同来定义相应的快捷键。

    ​ setStatusTip()则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。

    ​ 将这个 QAction 的 triggered()信号与 MainWindow 类的 open()函数连接起来。当用户点击了这个 QAction 时,会自动触发 MainWindow 的 open()函数。

  • 相关阅读:
    洛谷-P1591 阶乘数码
    洛谷-P1328 生活大爆炸版石头剪刀布
    git的使用
    docker下载命令
    springboot学习笔记
    内部类被实例化才会被加载进内存测试
    springboot环境搭建遇到的问题
    Java多线程的锁机制
    spring JdbcTemplate学习
    多线程循环注意
  • 原文地址:https://www.cnblogs.com/nsfoxer/p/14361263.html
Copyright © 2011-2022 走看看