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

相关文章推荐

Qt中关于菜单的那些事

Qt中添加菜单有两种方法:通过Qt Designer添加和手工加代码添加,下面的程序演示了如何手工给应用程序添加菜单 注:Qt中创建上下文菜单的方法有两种:一种是重载contextMenuEvent...

QtMainWindow菜单的使用

在qt的MainWindow项目中可以设置窗口的菜单,用记事本为例子了解一下什么是菜单栏,什么是菜单,什么是菜单项: 这个是菜单栏,用来“存放“菜单的。     这是在菜单栏上一个一个的菜单,用来...

Qt自定义工具栏,类似word

1.相关函数 QToolBar类包含函数addWidget(QWidget *widget)和insertWidget(QAction *before, QWidget *widget),说明工具栏不...

Qt 小知识点总结

写程序时经常会遇到一些很关键的代码,不长,但是写一篇文章来记录又不合适。现在就在这里把我遇到的小的qt知识点记录下来。这篇文章会不断更新。 1.让QToolbar始终悬浮 mainToolBar = ...

Qt4 Menubar and Toolbar

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

使用Qt designer 向菜单栏和工具栏添加action

在使用Qt创建桌面程序的时候,经常会使用Qt designer来设计程序界面。 而Qt窗口类中,QMenuBar和QToolBar中并没有按钮或选项类的控件,取而代之的是要向这些控件中添加QActio...
  • donyac
  • donyac
  • 2015年07月26日 22:09
  • 6867

Qt中实现简单的菜单栏,工具栏和状态栏!

看了一下啊Qt的布局管理机制和Qt的控件,就综合到一起,写了一个简易的Qt代码 还有就是想问一下是否有入门的Qt程序比如实现计算器类型的可以练一下手,巩固一下学的知识! main.cpp ...

Qt4 关于在工具栏添加和删除按钮QToolButton

一般的情况下有工具栏的都用QMainWindow作为基类,但是我不想用QMainWindos做基类,我只是想使用其中的QToolButton和StatusBar,所以用QWidget做基类 QToo...

QT笔记70:工具栏右对齐增加控件

比较简单的办法如下:  QWidget  * spacer  =   new  QWidget( this );    spacer -> setSizePolicy(QSizePolicy:...

qt可停靠控件和工具栏(Dock Widgets and Toolbars)

     可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动。QMainWindow提供了四个可停靠控件的地方:上方,下方,左方,右方。Microsoft Visual Stadio...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt界面添加菜单,工具栏以及状态栏
举报原因:
原因补充:

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