在Qt-GUI应用程序中如果界面的按钮很多的话,我们在处理按键及其对应事件的时候就会比较麻烦,我想在按钮比较多的时候大家都会用QButtonGroup实例一个对象,然后把用到的按键加到该对象中去,然后连接QButtonGroup的信号艹,最后在槽函数中响应对应的按键信号。但是这样要在槽函数中进行分类讨论,比较麻烦,接下来介绍一种更简单的方法,更少的代码实现一样的功能!
首先,建立一个Qt-GUI应用程序MyQtApp,系统会默认创建MyQtApp.cpp,MyQtApp.h和MyQtApp.ui。然后我们在UI布局文件家两个按键QPushButton和一个QLineEdit。如下图:
我们要在用户点击运行对应的按钮的时候,输出对应的消息。传统的做法是将各个按钮分别建立对应的信号槽,但是这样代码量会很多。下面是我搞的一个按键响应框架,代码量少,一样实现功能。
MyQtApp.h
#pragma once
#include <QtWidgets/QWidget>
#include <QButtonGroup>
#include "ui_MyQtApp.h"
class MyQtApp;
typedef int R_FUNC_ID;
typedef bool(MyQtApp::*R_FUNC)(); // 运行函数指针
typedef std::vector < R_FUNC > R_FUNC_LIST;
class MyQtApp : public QWidget
{
Q_OBJECT
public:
MyQtApp(QWidget *parent = Q_NULLPTR);
void initButtons();
protected slots:
void onButtonGroupClicked(int bid);
private:
Ui::MyQtAppClass ui;
QButtonGroup *btnGroup;
QMap<R_FUNC_ID, R_FUNC> rFuncGroup;
public:
// 添加新的按钮时在下面添加一个对应的函数
bool runFunc_1();
bool runFunc_2();
//bool runFunc_n();
// ···
};
MyQtApp.cpp
#include "MyQtApp.h"
#define ADD_BTN(_btn,_id) btnGroup->addButton(_btn,_id)
#define ADD_FUNC(_id,_func) rFuncGroup.insert(_id,_func)
#define REG_BTN(_btn,_id,_func) ADD_BTN(_btn,_id);ADD_FUNC(_id,_func)
#define RUN_FUNC(_id) (this->*rFuncGroup.value(_id))()
MyQtApp::MyQtApp(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
initButtons();
}
void MyQtApp::initButtons(){
btnGroup = new QButtonGroup(this);
rFuncGroup.clear();
int id = 0;
// 注册按键 每次添加新的按键只要注册一下就可以用了。
REG_BTN(ui.bRunFunc1, id, &MyQtApp::runFunc_1); id++;
REG_BTN(ui.bRunFunc2, id, &MyQtApp::runFunc_2); id++;
connect(btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(onButtonGroupClicked(int)));
}
void MyQtApp::onButtonGroupClicked(int bid){
//R_FUNC rf = rFuncGroup.value(bid);
//(this->*rf)();
RUN_FUNC(bid);
}
bool MyQtApp::runFunc_1(){
ui.lineEdit->setText("Run function 1");
return true;
}
bool MyQtApp::runFunc_2(){
ui.lineEdit->setText("Run function 2");
return true;
}
// ···
/*
bool MyQtApp::runFunc_n(){
ui.lineEdit->setText("Run function n");
return true;
}
*/
每次添加新的按键,只要一行注册代码即可,然后在对应的函数内实现具体的功能即可。这样只有2个按键看不出代码量省了多少,如果非常多按键的时候会看到很明显的区别。以下是运行效果图:
也许看了代码你会说为嘛不用QMap<QAbstractButton *, R_FUNC>也可以实现,加个id干哈,因为有时候会出现需要用到这个id的场合,具体我也不大会表述清楚,但是加个id也不碍事。源码点这边!