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

版权声明:更多文件,请访问 qzher.com 致力于良心IT培训,深圳QQ群:326023167 https://blog.csdn.net/sinat_35523212/article/details/52348929

原文:


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



猜你喜欢

转载自blog.csdn.net/sinat_35523212/article/details/52348929