Qt界面添加菜单,工具栏以及状态栏

原创 2016年08月28日 23:22:17

原文:


http://qzher.com/?p=592



Qt和MFC在架构上有些不一样

MFC基本上就是单文档结构/多文档结构,以及基于对话框应用程序

而Qt就是Widgets,以及Quick应用程序。而且这两种应用程序,都可以直接通过新建一个空的qmake应用程序menuToolbarStatusBar,再添加cpp,ui或qml,都能达到自己想要的要求

而且Qt的框架相对简单很多,不像MFC框架,一创建后就很多源代码,开发者必须了解MFC源代码的各流程机制

下面,以一个Widgets应用程序演示如何添加菜单,工具栏,以及状态栏的显示

 在工程中的mainwindow.ui中,即默认添加了菜单,工具栏以及状态栏

再疏理一下widgets应用程序默认的框架:

main函数中相对非常简单

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

 

    return a.exec();

}

 

 

建立一个app应用程序,然后a.exec()进入消息循环

MainWindow w;

    w.show();

进行界面的显示

进入MainWindow类中

namespace Ui {

class MainWindow;

}

 

class MainWindow : public QMainWindow

{

    Q_OBJECT

 

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

 

private:

    Ui::MainWindow *ui;

};

 

 

类中包含了一个重要的指针: Ui::MainWindow *ui;

再看此ui的来历:

class MainWindow: public Ui_MainWindow {};

它又是继承于  Ui_MainWindow
继续追根溯源,发现 Ui_MainWindow 存在于 ui_mainwindow.h 文件中,是一个 class Ui_MainWindow 类

mainwindow.ui 在编译后,就会生成 mainwindow.h ,生成的.h文件包含了UI中所有widget等信息

上面所述,简单描述即:MainWindow类中,有一ui指针,为指向UI界面的类。

所以,可以通过ui指针,获取界面中的所有元素。

比如,要获取菜单栏,既然UI中已有,则直接在 MainWindow 中调用

QMenuBar* pMenuBar = ui->menuBar;    即可

MenuBar为一系列Menu的容器,再往MenuBar中添加Menu即可:

QMenu的构造函数如下:

QMenu(QWidget *parent = Q_NULLPTR)

QMenu(const QString &title, QWidget *parent = Q_NULLPTR)

构造好Menu后,通过pMenuBar的addMenu函数,往MenuBar中添加Menu即可

在菜单中,需要了解的就是QAction

QAction能够根据它添加的位置来改变自己的样子——如果添加到菜单中就会显示成菜单项(文件,工具,收藏等菜单项);如果添加到工具条,就会显示成一个按钮。

而且它也如它名字所述:Action, 它可以完成鼠标点击,键盘快捷键等操作,并触发信息,响应动作

代码说话,注释也较为详尽:

    QMenuBar* pMenuBar = ui->menuBar;   // 菜单栏

 

    // 新建一个菜单A

    QMenu* pMenuA = new QMenu("&qzher");    // q则为Alt方式的快捷键

    // 新建一个Action,然后加入到菜单A

    QAction* pActionA = new QAction("subMenu");

    pMenuA->addAction(pActionA);

 

    // 将菜单A再添加到MenuBar

    pMenuBar->addMenu(pMenuA);

 

 

    // 如上述,此菜单即添加了图标

    QMenu* pMenuB = new QMenu("青哲");

    pMenuB->setIcon(QIcon(QPixmap(":/img/2.png")));

    QAction* pActionB = new QAction(QIcon(QPixmap(":/img/3.png")), "子菜单");

    pActionB->setStatusTip(tr("子菜单的提示信息"));

    pMenuB->addAction(pActionB);

    pMenuBar->addMenu(pMenuB);

 

显示如图示:

现在点击菜单,不会有任何反应,再将菜单添加事件响应,比如,点击subMenu,就弹出一个QMessageBox,点击 子菜单 ,则退出程序

这需要将Action和信号槽关联起来即可:

    QObject::connect(pActionA, SIGNAL(triggered(bool)), this, SLOT(onMsg()));

    QObject::connect(pActionB, SIGNAL(triggered(bool)), this, SLOT(close()));

 



Action的信号 ,通过帮助查询可知,当被点击的时候,会发送  triggered(bool) 信号 ,然后自己建立槽,或调用框架的槽函数响应即可

实现onMsg()槽函数:

private slots:

    void onMsg();

 

void MainWindow::onMsg()

{

    QMessageBox msgBox;

    msgBox.setText("qzher.com  menu test");

    msgBox.exec();

}

 


通过上述步骤就可以简单地建立好菜单以及菜单的事件响应,

同理,ToolBar原理也类似,有了菜单的知识,ToolBar就显得非常容易了:

往ToolBar添加Action,然后将Action关联至槽信号即可

    

    QToolBar* pToolBar = ui->mainToolBar;

    QAction* pActionC = new QAction(QIcon(QPixmap(":/img/1.png")), "QZHER");

    pToolBar->addAction(pActionC);

    QObject::connect(pActionC, SIGNAL(triggered(bool)), this, SLOT(onMsg()));

 


ToolBar,则直接在上面显示一个文字:

    QStatusBar* pStatusBar = ui->statusBar;

    pStatusBar->showMessage(qzher's software");

 

 


一般ToolBar用来起指示作用,再将它弄复杂点,显示鼠标移动的坐标:

若需要在鼠标移动的时候,就要获取到坐标点,则要进行鼠标追踪,在mainwindow类构造函数的时候添加如下,即在此控件上,会进行鼠标追踪

    // 鼠标追踪

    this->setMouseTracking(true);

    ui->centralWidget->setMouseTracking(true);


若不添加此两行,则要按住鼠标后移动,方能获取鼠标当前的坐标

再实现鼠标移动,在StatusBar上显示即可:

protected:

    virtual void mouseMoveEvent(QMouseEvent *event);

 

void MainWindow::mouseMoveEvent(QMouseEvent *event)

{

    // 鼠标事件包含了全局坐标与本地坐标,在此只需要本地坐标即可

    QPointF pt = event->localPos();

    // 将坐标点格式化

    QString strShow = QString("当前坐标:X:%1 Y:%2").arg(pt.x()).arg(pt.y());

    // 在SatusBar中实时显示

    ui->statusBar->showMessage(strShow);

}

 

最终效果:

源码下载:http://download.csdn.net/detail/sinat_35523212/9604122

由于工程在Linux下编写,若在Windows下编译报错,请删除代码中的中文注释即可



原文:


http://qzher.com/?p=592



版权声明:更多文件,请访问 qzher.com 致力于良心IT培训,深圳QQ群:326023167

Qt4 Menubar and Toolbar

在这篇文章中,基本实现了Menubar和Toolbar的功能,但还很不成熟,需要以后修正,仅为以后参考。 另外,所创建的工程简单照搬了Qt Demos中browser的搜索框,以添加一个简单功能。 ...
  • pigautumn
  • pigautumn
  • 2013年05月31日 14:45
  • 8532

QT中菜单Menu与工具栏Toolbar中各个Action的动态添加删除

就像Swing里面的Action一样,Qt里面也有一个类似的类,叫做QAction。顾名思义,QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也...
  • yujiaming493323
  • yujiaming493323
  • 2013年04月06日 21:16
  • 5192

Qt添加菜单和工具栏

本节,我们将在前面主窗口基础之上,添加菜单和工具栏等的动作。虽然 Qt Creator 已经帮我们实现了主窗口的框架代码,但是具体的功能,还是需要我们一行行添加。 Qt 使用QAction类作为...
  • raiven2008
  • raiven2008
  • 2015年02月10日 20:54
  • 3505

QT5 添加菜单栏

QT5 添加菜单栏 在创建一个widget后想添加一个菜单栏(用代码的方法添加),并在菜单栏上添加菜单。那么首先要创建一个菜单栏QMenu,然后再添加菜单QAction。 代码如下:      ...
  • chenjianqi0502
  • chenjianqi0502
  • 2017年01月21日 09:53
  • 511

Qt模块化笔记之Qt Widgets——菜单和菜单栏

主窗口MainWindow需要菜单栏QMenuBar及菜单QMenu来组成自身,一般应用程序的所有功能都能在菜单中找到。接下来就来说说它们。 ———————————————————————————...
  • xsjqqq123
  • xsjqqq123
  • 2014年02月06日 22:44
  • 3049

QT中三种构建菜单栏的方法

QT中三种构建菜单栏的方法
  • hustyangju
  • hustyangju
  • 2013年12月30日 10:45
  • 2839

QT中QMainWindow手动添加菜单栏以及其他控件

QT中的建立一个界面为QMainwindow的主界面,如果想在主界面中手动添加MenuBar,同时再添加别的控件时,一定要定义一个QWidget的控件,把除了MenuBar之外的控件放到QWidget...
  • t46414704152abc
  • t46414704152abc
  • 2016年01月04日 02:01
  • 3254

Qt Creator添加菜单图标及状态栏的显示

  • 2016年08月15日 09:55
  • 43KB
  • 下载

Qt学习之给QPushButton添加菜单CustomContextMenu方法

上篇也说了,题目虽然说是给QPushButton添加鼠标右键菜单,其实对于所有的QWidget都是适用的。之所以说QPushButton,是以QPushButton为例进行实现,写的类继承自QPush...
  • u011417605
  • u011417605
  • 2016年03月19日 12:58
  • 5081

Qt中关于菜单的那些事

Qt中添加菜单有两种方法:通过Qt Designer添加和手工加代码添加,下面的程序演示了如何手工给应用程序添加菜单 注:Qt中创建上下文菜单的方法有两种:一种是重载contextMenuEvent...
  • qiurisuixiang
  • qiurisuixiang
  • 2012年07月21日 10:04
  • 26889
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt界面添加菜单,工具栏以及状态栏
举报原因:
原因补充:

(最多只允许输入30个字)