QT自定义带参数信号与槽函数
我的软件界面是这样的,点击图标按钮后进入子项的参数配置。
由于按钮众多,每个按钮都有点击事件,一个个去写是在太多麻烦,而且我的这个配置软件各个子项的参数配置页面基本是差不多的,只是传递的参数有差异而已。
通过自定义一个信号,用于传递按钮按下事件,同时传递被点击按钮的行列号,便于后续处理。
首先是头文件,用于实现布局及定义信号及槽函数。在这里我们自定义一个信号void port_clicked(int col,int row)以及对应的槽函数void port_setting(int col,int row),其它的则是软件布局涉及到的一些控件。
class mainWidget : public QWidget
{
Q_OBJECT
public:
mainWidget(QWidget *parent = nullptr);
~mainWidget();
signals:
void port_clicked(int col,int row);
private:
QGroupBox *groupBox;
QGridLayout *gridLayout;
QPushButton *portbtn[28][8];
QLabel *titlelabel[4];
QLabel *subHtitlelabel[28];
QLabel *subVtitlelabel[8];
private slots:
void port_setting(int col,int row);
};
接下来是cpp文件,首先是创建一个widget,然后在widget里又放了一个groupbox用于放置按钮。按钮使用grid布局后,添加标签字符。然后在布局时用到的循环里发送信号,将各个按钮的点击汇总为port_clicked(int col,int row),再使用connet绑定该信号与槽函数,接下来就可以在port_setting(int col,int row)里统一处理了。
mainWidget::mainWidget(QWidget *parent)
: QWidget(parent)
{
this->setGeometry(200,100,1440,810);
groupBox=new QGroupBox(this);
groupBox->setGeometry(100,100,1200,600);
gridLayout=new QGridLayout(this->groupBox);
QList <QString>list;
list<<"CON.OUT"<<"NET.OUT"<<"CON.IN"<<"NET.IN";
QFont ft;
ft.setPointSize(18);
for (int i=0;i<4;i++)
{
titlelabel[i]=new QLabel(this);
titlelabel[i]->setText(list[i]);
titlelabel[i]->setFont(ft);
}
titlelabel[0]->setGeometry(400,70,120,20);
titlelabel[1]->setGeometry(980,70,120,20);
titlelabel[2]->setGeometry(20,310,120,20);
titlelabel[3]->setGeometry(20,600,120,20);
QFont subft;
subft.setPointSize(18);
QList <QString>subVlist;
subVlist<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"1"<<"2";
QList <QString>subHlist;
subHlist<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8"<<"9"<<"10"<<"11"<<"12"<<"13"<<"14"<<"15"<<"16"
<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8"<<"9"<<"10"<<"11"<<"12";
for (int col=0;col<28;col++)
{
for (int row=0;row<8;row++)
{
portbtn[col][row]=new QPushButton(this->groupBox);
portbtn[col][row]->setFlat(true);
portbtn[col][row]->setIconSize(QSize(24,24));
if(row<6&&col<16)
portbtn[col][row]->setIcon(QPixmap(":/image/portB.png"));
else if(row<8&&col<16)
portbtn[col][row]->setIcon(QPixmap(":/image/portR.png"));
else if(col<28&&row<6)
portbtn[col][row]->setIcon(QPixmap(":/image/portG.png"));
else
portbtn[col][row]->setIcon(QPixmap(":/image/portH.png"));
gridLayout->addWidget(portbtn[col][row],row,col);
gridLayout->setRowStretch(row,1);
if(col==0)
{
subVtitlelabel[row]=new QLabel(this);
subVtitlelabel[row]->setText(subVlist[row]);
subVtitlelabel[row]->setFont(subft);
subVtitlelabel[row]->setGeometry(100,145+69*row,20,20);
}
if(row==0)
{
subHtitlelabel[col]=new QLabel(this);
subHtitlelabel[col]->setText(subHlist[col]);
subHtitlelabel[col]->setFont(subft);
subHtitlelabel[col]->setAlignment(Qt::AlignVCenter);
subHtitlelabel[col]->setGeometry(120+42*col,120,36,20);
}
connect(portbtn[col][row], &QPushButton::clicked, this,[=]()
{
emit port_clicked(col,row);
});
}
gridLayout->setColumnStretch(col,1);
}
groupBox->setLayout(gridLayout);
connect(this, SIGNAL(port_clicked(int,int)), this, SLOT(port_setting(int,int)));
}
mainWidget::~mainWidget()
{
}
void mainWidget::port_setting(int col,int row)
{
portbtn[col][row]->setVisible(false);
}
我这里测试用了setVisible函数,可以看到被点击的按钮都消失了,证明功能有效。