qt 给容器中的控件添加信号槽

44 篇文章 8 订阅

之前做的将动态创建的控件,放到容器中,从而可以使用数组访问,现在记一下怎样给它们设置事件。

1、实现思路:

比如我创建了10个按钮,每创建一个,我就构建一个信号槽的连接。由于我不能构建太多的槽函数,所以,这10个按钮我都绑定到同一个槽函数上去。

又一个问题来了,问题是我该怎么区分我点击的哪个按钮?其实只要在connect中将按钮在容器中的位置传递到槽函数中。

2、详细操作:

以下将接着:https://blog.csdn.net/qq_36780295/article/details/113860352 来写。

之前实现的是QQ的消息列表,想要进一步实现点击消息列表打开消息聊天框。为此,我需要区分具体点击的是哪一个自建控件。由于之前使用的QWidget不具备双击操作,所以把自建控件的基础控件改为了QPushButton。下面将会一步一步的实现点击事件。

(1)修改自建控件:

首先在mainwindow.h中修改控件和容器

    QPushButton* message_boxs(const QString &name
                              ,const QString &icon
                              ,const QString &message
                              ,const QString &msg_date) {
        QPushButton *qwidget = new QPushButton(this);

        QPushButton *qqicon = new QPushButton(qwidget);    //头像
        QLabel *qqname = new QLabel(qwidget);     //名字
        QLabel *qqmessage = new QLabel(qwidget);
        QLabel *msg_date_label = new QLabel(qwidget);

        //头像,qq名,qq信息,最后信息时间
        qqicon->setStyleSheet(QString("width:40px;height:40px;border:0px;border-radius:20px;border-image:url(:/new/prefix1/source/%1);").arg(icon));
        qqname->setText(name);

        qqmessage->setText(message);
        qqmessage->setStyleSheet("color:rgb(173,173,173)");
        msg_date_label->setText(msg_date);

        qqicon->move(15,10);
        qqname->move(65,15);
        qqmessage->move(65,35);
        msg_date_label->move(240,15);

        qwidget->resize(290,60);
        return qwidget;
    }

    QList<QPushButton *> qWidget_group;
(2)创建槽函数:

mianwindow.h中创建作为响应的槽函数:

void open_chat_window(int i,QString a,QString b,QString c,QString d);
(3)创建信号槽链接,并将在容器中的位置传递进去:

mianwindow.cpp中修改代码:(这里用鼠标单击来做)

    QStringList namelist,iconlist,meslist,timelist;
    //使用时,以下内容就可以替换为数据库中的信息。像QQ中那样则应该还需要把信息传递给服务器,信息等存储在本地,朋友的头像和其他信息等需要在服务器下载
    namelist.append(u8"喜羊羊");
    namelist.append(u8"懒羊羊");
    namelist.append(u8"慢羊羊");
    namelist.append(u8"泰哥");
    iconlist.append("1.jpg");
    iconlist.append("4.jpg");
    iconlist.append("5.jpg");
    iconlist.append("15.jpg");
    meslist.append(u8"哈哈哈哈");
    meslist.append(u8"我肚子好饿");
    meslist.append(u8"发生肾莫事了");
    meslist.append(u8"我一拳头下去就把他鼻子打骨折了");
    timelist.append("20:21");
    timelist.append("20:21");
    timelist.append("20:21");
    timelist.append("20:21");

    for (int i=0;i<4;i++)
        qWidget_group.push_back(message_boxs(namelist.at(i),iconlist.at(i),meslist.at(i),timelist.at(i))),
        qWidget_group[i]->setParent(ui->message_box),
        qWidget_group[i]->setStyleSheet("QPushButton{border:0px;}" "QPushButton::hover{background-color:rgb(235,235,235)}"),
        qWidget_group[i]->move(0,60*i),
        //连接信号和槽也相当于调用槽函数,这里直接将参数i赋予槽函数响应即可
        connect(qWidget_group[i],&QPushButton::clicked, this, [=](){open_chat_window(i,namelist.at(i),iconlist.at(i),meslist.at(i),timelist.at(i));}); 
(4)槽函数代码:

mainwindow.cpp中添加槽函数代码:

void qqchat_main_window::open_chat_window(int i,QString a,QString b,QString c,QString d)
{
    qDebug()<<u8"点击的是第"<<i<<u8"个消息项,该消息联系人是"<<a;
}

试着点击界面上的自建控件,查看输出。

(5)运行结果:

(在控件上随便做了一些点击,不过相比于QQ还是有点问题,点击名字、消息和其他空白处都可以触发,但是点击头像就触发不了了)
在这里插入图片描述
这样就实现信号的绑定了。如果对于不同的控件有不同的处理时,则可以照样每一个都绑定,然后通过在容器中的位置i来过滤接下来的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值