Qt-GUI应用程序的按键框架

        在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也不碍事。源码点这边


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值