原文:
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