Qt教程-Qt Creator中定制GUI(添加图标,菜单,工具栏,状态栏)

这里我们使用上一篇的MainWindow工程作为例子。
首先进入UI设计界面,我们新建一个help菜单,然后在help菜单下新建一个about菜单。
如下图所示:

接着我们想为about菜单添加一个工具栏按钮。工具栏按钮一般是以图标的形式存在,想在界面中添加图标,我们需要先新建一个资源文件。选择Qt Creator中的新建按钮,新建一个Qt Resource File 如下图所示:

这里我们新建一个名为res的资源文件。

最后选择项目控制系统,点击完成。

创建完毕资源文件后,在插入图标之前我们需要先添加一个资源前缀。

添加好前缀后我们可以在资源前缀下添加具体的资源了(比如图片资源)。这里直接选择一个前缀然后点击添加文件即可。

这里我们添加了一个/image的前缀,并且向这个前缀里添加了一个icon1.png,最后还给icon1.png这个文件取了个别名叫about。
保存后返回UI设计界面,选择about的Action即可添加图标。

到这里我们已经成功的添加了菜单,并且给about菜单前面加上了一个图标。
最后如果我们想把about菜单放到工具栏上的花,把about的Action拖拽到工具栏上即可。

之后我们可以编译然后运行察看效果。
运行效果如下图所示:

可能有朋友会看到.ui文件实际上是记录界面和控件属性的XML文件,XML很显然是不能经过C++编译器直接编译成二进制文件的,那么我们设计的界面Qt是怎么处理变成程序界面的呢?如果有心看一下编译使用的临时目录那么很容易就能发现答案。前面我们提到了moc这个东西,在这里也是一样,由moc负责把XML文件转换成C++编译器可编译的标准C++代码。
这里我直接贴出moc针对前面的ui文件生产的代码。

/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.8.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QAction *actionabout;
    QWidget *centralWidget;
    QMenuBar *menuBar;
    QMenu *menuhelp;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        //设置窗口大小
        MainWindow->resize(348, 177);
        actionabout = new QAction(MainWindow);
        //设置对象名称
        actionabout->setObjectName(QStringLiteral("actionabout"));
        QIcon icon;
        //载入图标文件
        icon.addFile(QStringLiteral(":/image/about"), QSize(), QIcon::Normal, QIcon::Off);
        //设置图标文件到QAction
        actionabout->setIcon(icon);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        MainWindow->setCentralWidget(centralWidget);
        //创建设置菜单栏
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 348, 26));
        //创建设置一级菜单
        menuhelp = new QMenu(menuBar);
        menuhelp->setObjectName(QStringLiteral("menuhelp"));
        //把菜单栏添加到主窗口
        MainWindow->setMenuBar(menuBar);
        //创建设置工具栏
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        //创建设置状态栏
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        MainWindow->setStatusBar(statusBar);

        //把菜单添加到菜单栏
        menuBar->addAction(menuhelp->menuAction());
        menuhelp->addAction(actionabout);
        mainToolBar->addAction(actionabout);
        //设置菜单内容
        retranslateUi(MainWindow);
        //根据槽函数名绑定信号
        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", Q_NULLPTR));
        actionabout->setText(QApplication::translate("MainWindow", "about", Q_NULLPTR));
#ifndef QT_NO_TOOLTIP
        actionabout->setToolTip(QApplication::translate("MainWindow", "about", Q_NULLPTR));
#endif // QT_NO_TOOLTIP
#ifndef QT_NO_STATUSTIP
        actionabout->setStatusTip(QApplication::translate("MainWindow", "about", Q_NULLPTR));
#endif // QT_NO_STATUSTIP
        menuhelp->setTitle(QApplication::translate("MainWindow", "help", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

当界面创建时会自动调用 setupUi这个函数。我们可以看到函数先创建了一个名为actionabout的QAction对象,顾名思义,QAction这个类代表了窗口的一个“动作”,也就是代表一个要完成的操作,QAction包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息,当QAction被添加到菜单时,就是作为一个菜单的选项出现的,当QAction被添加到工具栏时就是作为一个工具栏的按钮出现。
我们还可以看到生成的代码中对每个对象都执行了setObjectName,同样顾名思义,是为Object对象设置了一个名字。而QStringLiteral则是一个宏,作用是从“字符串常量”创建QString对象,而QString对象我们可以简单的认为和std::string是差不多的,基本上我们可以认为QStringLiteral(“text”)大致上等于std::string(“text”)。
接着创建了一个QIcon对象,通过addFile加载icon。addFile的第一个参数是icon的路径其中以 : 开始,意味着从资源文件中查找资源(资源名可以使用文件名也可以使用别名),最后setIcon给QAction,这样我们的动作就有了图标。设置显示的文字和状态栏的提示是通过retranslateUi的setText来完成的。QApplication::translate函数是用来处理界面国际化问题的,作用是根据设置自动替换文本翻译,这样就可以做到中文环境显示中文,英文环境显示英文了。
我们继续看代码,代码中还创建了QMenuBar,QToolBar,QStatusBar这么几个对象,这几个对象分别是菜单栏,工具栏,状态栏。最后通过对应的set函数显示在界面上。
最后是QMenu,QMenu对象是一级菜单,创建了菜单之后通过addAction添加到菜单栏,之后再把之前创建的QAction添加到一级菜单,由此形成了我们看到的一级一级的菜单。

《Qt教程-Qt Creator中定制GUI(添加图标,菜单,工具栏,状态栏)》上有2条评论

  1. 请教一下如何给菜单添加快捷键?给菜单下的项目添加快捷键可以直接在 Qt Designer 的 Action Editor 中添加,但是如果给菜单添加呢?比如说我想要按下 F1 就打开 help 菜单这样子的.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据