针对多按钮的图片进行切换操作,emitcan主要是用来判断按下否,flag_magnify是用来判断窗口是否放大。
一、代码重复造成冗余
原本代码:
void son_interface_1::toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage, const QString& yesImage)
{
if (emitCan)
{
button->setStyleSheet(QString("QPushButton {"
"image: url(%1);"
"border: none;" /* 没有边框 */
"background: transparent;" /* 背景透明 */
"background-color: transparent;" /* 防止背景色干扰*/
"}").arg(noImage));
emitCan = false;
}
else
{
qDebug()<<"进入点击后更改";
button->setStyleSheet(QString("QPushButton {"
"image: url(%1);"
"border: none;" /* 没有边框 */
"background: transparent;" /* 背景透明 */
"background-color: transparent;" /* 防止背景色干扰 */
"}").arg(yesImage));
emitCan = true;
}
}
void son_interface_1::on_pushButton1_clicked()
{
if(flag_magnify)
{
toggleButtonImage(ui->pushButton1, emitCan, ":/image/bigno.png", ":/image/bigyes.png");
}
else
{
toggleButtonImage(ui->pushButton1, emitCan, ":/image/no.png", ":/image/yes.png");
}
}
void son_interface_1::on_pushButton2_clicked()
{
if(flag_magnify)
{
toggleButtonImage(ui->pushButton2, emitCan_2, ":/image/bigno.png", ":/image/bigyes.png");
}
else
{
toggleButtonImage(ui->pushButton2, emitCan_2, ":/image/no.png", ":/image/yes.png");
}
}
........
//下面还有n个相同的槽函数
二、把代码进行封装和重用
1.创建按钮容器(或数组):将所有按钮存储在一个容器中。
bool flag_magnify=false;//用于标志是否是桌面放大
void toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage,const QString& yesImage,const QString& objectName);
std::vector<QPushButton*> buttons; // 存储所有按钮
std::vector<bool> emitCans; // 存储每个按钮的状态
QList<QString> buttonNames; // 新增列表以存储按钮名称
QList<QString> spinboxNames; // 新增列表以存储按钮名称
2.统一处理点击事件:使用循环处理所有按钮的点击事件,而不是为每个按钮单独编写处理函数。获取所有的控件,并且把他们放入容器中。
// 设置 QPushButton
QList<QPushButton*> buttonList = findChildren<QPushButton*>();
for (QPushButton* button1 : buttonList)
{
if(button1->objectName()=="pushButton"||button1->objectName()=="YES"||button1->objectName()=="save")
{
continue;
}
buttonNames.push_back(button1->objectName()); // 保存按钮对象名称
buttons.push_back(button1);
emitCans.push_back(false); // 初始状态为 false
// 连接按钮点击事件到处理函数
connect(button1, &QPushButton::clicked, this, &son_interface_1::onButtonClicked);
}
3.使用槽函数进行分析处理
// 实现 onButtonClicked 函数
void son_interface_1::onButtonClicked()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());
if (!button) return;
// 在按钮数组中查找该按钮
auto it = std::find(buttons.begin(), buttons.end(), button);
if (it == buttons.end()) return;
// 计算按钮在数组中的索引位置
int index = std::distance(buttons.begin(), it);
// 输出按钮的对象名称
qDebug() << "按钮对象名称:" << buttonNames[index]; // 输出存储的按钮对象名称
bool emitCan = emitCans[index]; // 使用值
// 调用 toggleButtonImage 函数
if (flag_magnify)
{
toggleButtonImage(button, emitCan, ":/image/bigno.png", ":/image/bigyes.png",buttonNames[index]);
} else
{
toggleButtonImage(button, emitCan, ":/image/no.png", ":/image/yes.png",buttonNames[index]);
}
// 更新 emitCans 数组中的值
emitCans[index] = emitCan;
}
4.再进行具体的操作
void son_interface_1::toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage, const QString& yesImage,const QString& objectName)
{
if (emitCan)
{
qDebug()<<objectName<<"取消";
button->setStyleSheet(QString("QPushButton {"
"image: url(%1);"
"border: none;"
"background: transparent;"
"background-color: transparent;"
"}").arg(noImage));
emitCan = false;
}
else
{
qDebug()<<objectName<<"按下";
button->setStyleSheet(QString("QPushButton {"
"image: url(%1);"
"border: none;"
"background: transparent;"
"background-color: transparent;"
"}").arg(yesImage));
emitCan = true;
}
}