之前做的将动态创建的控件,放到容器中,从而可以使用数组访问,现在记一下怎样给它们设置事件。
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
来过滤接下来的处理。