我的软件界面是这样的,点击图标按钮后进入子项的参数配置。

        由于按钮众多,每个按钮都有点击事件,一个个去写是在太多麻烦,而且我的这个配置软件各个子项的参数配置页面基本是差不多的,只是传递的参数有差异而已。

        通过自定义一个信号,用于传递按钮按下事件,同时传递被点击按钮的行列号,便于后续处理。

        首先是头文件,用于实现布局及定义信号及槽函数。在这里我们自定义一个信号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 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 subVlist;

subVlist<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"1"<<"2";

QList 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函数,可以看到被点击的按钮都消失了,证明功能有效。

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: