zoukankan      html  css  js  c++  java
  • Qt__主窗口、菜单和工具条(QMainWindow,QMenu,QToolBar)

    转自豆子空间

    主窗口##

    Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow。MainWindow继承自QMainWindow。QMainWindow窗口分成几个主要的区域:

    最上面是Window Title,用于显示标题和控制按钮,比如最大化、最小化和关闭等;下面一些是Menu Bar,用于显示菜单;再下面一点事Toolbar areas,用于显示工具条,注意,Qt的主窗口支持多个工具条显示,因此这里是ares,你可以把几个工具条并排显示在这里,就像Word2003一样;工具条下面是Dock window areas,这是停靠窗口的显示区域,所谓停靠窗口就是像Photoshop的工具箱一样,可以在主窗口的四周显示;再向下是Status Bar,就是状态栏;中间最大的Central widget就是主要的工作区了。

    菜单和工具条##

    QMainWindow的基础之上添加菜单和工具条。

    Qt里面有一个类,叫做QAction。顾名思义,QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽),等等。神奇的是,QAction能够根据添加的位置来改变自己的样子——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮。

    添加一个打开命令。那么,就在头文件里面添加一个私有的QAction变量:

    class QAction;
    //...
    private:
            QAction *openAction;
    //...
    

    注意,不要忘记QAction类的前向声明哦!要不就会报错的!

    然后我们要在cpp文件中添加QAction的定义。为了简单起见,我们直接把它定义在构造函数里面:

           openAction = new QAction(tr("&Open"), this);
           openAction->setShortcut(QKeySequence::Open);
           openAction->setStatusTip(tr("Open a file."));
    

    第一行代码创建一个QAction对象。QAction有几个重载的构造函数,我们使用的是

    QAction(const QString &text, QObject* parent);
    

    这一个。它有两个参数,第一个text是这个动作的文本描述,用来显示文本信息,比如在菜单中的文本;第二个是parent,一般而言,我们通常传入this指针就可以了。我们不需要去关心这个parent参数具体是什么,它的作用是指明这个QAction的父组件,当这个父组件被销毁时,比如delete或者由系统自动销毁,与其相关联的这个QAction也会自动被销毁。

    第二句,我们使用了setShortcut函数。shortcut是这个动作的快捷键。Qt的QKeySequence已经为我们定义了很多内置的快捷键,比如我们使用的Open。你可以通过查阅API文档获得所有的快捷键列表,或者是在QtCreator中输入::后会有系统的自动补全功能显示出来。这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")来实现快捷键。原因在于,这是Qt跨平台性的体现。比如PC键盘和Mac键盘是不一样的,一些键在PC键盘上有,而Max键盘上可能并不存在,或者反之,所以,推荐使用QKeySequence类来添加快捷键,这样,它会根据平台的不同来定义不同的快捷键。

    第三句是setStatusTip函数。这是添加状态栏的提示语句。状态栏就是主窗口最下面的一条。现在我们的程序还没有添加状态栏,因此你是看不到有什么作用的。

    下面要做的是把这个QAction添加到菜单和工具条:

            QMenu *file = menuBar()->addMenu(tr("&File"));
            file->addAction(openAction);
    
            QToolBar *toolBar = addToolBar(tr("&File"));
            toolBar->addAction(openAction);
    

    QMainWindow有一个menuBar()函数,会返回菜单栏,也就是最上面的那一条。如果不存在会自动创建,如果已经存在就返回那个菜单栏的指针。直接使用返回值添加一个菜单,也就是addMenu,参数是一个QString,也就是显示的菜单名字。然后使用这个QMenu指针添加这个QAction。类似的,使用addToolBar函数的返回值添加了一个工具条,并且把这个QAction添加到了上面。

    好了,主要的代码已经写完了。不过,如果你只修改这些的话,是编译不过的哦!因为像menuBar()函数返回一个QMenuBar指针,但是你并没有include它的头文件哦!虽然没有明着写出QMenuBar这个类,但是实际上你已经用到了它的addMenu函数了,所以还是要注意的!

    添加图标##

    回到mainwindow.cpp,在构造函数中填入代码:

    openAction->setIcon(QIcon("../resource/open-file.png"));
    

    使用setIcon添加图标。

    效果##


    linux_mint

    代码##

    //main.cpp
    #include <qapplication.h>
    #include "mainwindow.h"
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
    
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    //mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include <QMainWindow>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        QAction *openAction;
    };
    
    #endif // MAINWINDOW_H
    
    //mainwindow.cpp
    #include <QtGui/QAction>
    #include <QtGui/QMenu>
    #include <QtGui/QMenuBar>
    #include <QtGui/QKeySequence>
    #include <QtGui/QToolBar>
    #include <QMessageBox>
    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
            : QMainWindow(parent)
    {
            openAction = new QAction(tr("&Open"), this);
            openAction->setShortcut(QKeySequence::Open);
            openAction->setStatusTip(tr("Open a file."));
            openAction->setIcon(QIcon("../resource/open-file.png"));
            connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
    
            QMenu *file = menuBar()->addMenu(tr("&File"));
            file->addAction(openAction);
    
            QToolBar *toolBar = addToolBar(tr("&File"));
            toolBar->addAction(openAction);
    }
    
    void MainWindow::open()
    {
            QMessageBox::information(NULL, tr("Open"), tr("Open a file"));
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    
  • 相关阅读:
    C#字符串的比较
    C#字符串分割
    [Android] Android 卡片式控件CardView的优雅使用
    [Android] Android Studio 使用config.gradle统一管理项目的依赖库
    [Android] Android Studio 修改Gradle使用国内源
    [Android] Sqlite 数据库操作 工具封装类
    [Android] Android 去掉界面标题栏的方法
    [Android] Android RecycleView和ListView 自定义Adapter封装类
    [Android] Android 让UI控件固定于底部的几种方法
    [Android] Android读取Asset下文件的最简单的方法总结(用于MediaPlayer中)
  • 原文地址:https://www.cnblogs.com/narjaja/p/9112446.html
Copyright © 2011-2022 走看看