Loading

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()函数。

posted @ 2022-05-27 14:11  nsfoxer  阅读(26)  评论(0编辑  收藏  举报