当前位置: 首页 > article >正文

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


http://www.kler.cn/a/274379.html

相关文章:

  • 软件需求建模方法
  • CTF学习24.12.21[隐写术进阶]
  • 最新ubuntu20.04安装docker流畅教程
  • PHP接入美团联盟推广
  • uni-app商品搜索页面
  • 3.使用SD卡挂载petalinux根文件系统
  • PHP+MySQL开发组合:多端多商户DIY商城源码系统 带完整的搭建教程以及安装代码包
  • im-system学习
  • 嵌入式学习-ARM-Day4
  • 【FPGA】摄像头模块OV5640
  • Linux系统及操作 (05)
  • 【ESP32接入国产大模型之MiniMax】
  • Python入门(小白友好)
  • Springboot和Spring Cloud版本对应
  • ClickHouse--13--springboot+mybatis配置clickhouse
  • 红与黑(c++题解)
  • 【复现】【免费】基于多时间尺度滚动优化的多能源微网双层调度模型
  • springboot校服订购系统
  • 阿里云发布 AI 编程助手 “通义灵码”——VSCode更强了 !!
  • 考研失败, 学点Java打小工_Day3_卫语句_循环
  • 阿里云2核4G4M轻量应用服务器价格165元一年
  • [QJS xmake] 非常简单地在Windows下编译QuickJS!
  • MySQL数据自动同步到Es
  • 关系数据库:关系数据结构基础与概念解析
  • 代码随想录算法训练营第二十八天|93. 复原 IP 地址,78. 子集,90. 子集 II
  • GPT能复制人类的决策和直觉吗?