点击按钮弹出窗口
点击按钮创建窗口
Widget * widget = new Widget(0,vToolBtn[i]->text());
修改widget聊天窗口 构造函数 有2个参数
设置窗口的图标,标题
widget->show();方法显示窗口
解决多次点击弹出窗口的bug
加入bool的isShow并加入容器,控制每一个窗口自己的参数
判断标示 如果为true就不要多次打开
关闭聊天窗口时发生 自定义关闭信号
监听关闭信号 同时更新isShow参数的值
main.cpp
#include "widget.h"
#include <QApplication>
#include "dialoglist.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Widget w;
//w.show();
DialogList list;
list.show();
return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent, QString name);
~Widget();
private:
Ui::Widget *ui;
signals:
//关闭窗口发送关闭信息
void closeWidget();
public:
//关闭事件
void closeEvent(QCloseEvent *);
};
#endif // WIDGET_H
widget.cpp
这个是对话框的主窗口,处理窗口关闭事件,当窗口关闭的时候,发送消息到对话框列表,监听窗口关闭,然后再容器中更新并保存这个窗口关闭的标志位
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent, QString name) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
//重写关闭窗口的事件
void Widget::closeEvent(QCloseEvent * e)
{
emit this->closeWidget();
//sndMsg(UsrLeft);
//断开套接字
//udpSocket->close();
//udpSocket->destroyed();
QWidget::closeEvent(e);
}
Widget::~Widget()
{
delete ui;
}
dialoglist.h窗口是否关闭的标志位isShow设置成全局变量,方便更新
#ifndef DIALOGLIST_H
#define DIALOGLIST_H
#include <QWidget>
namespace Ui {
class DialogList;
}
class DialogList : public QWidget
{
Q_OBJECT
public:
explicit DialogList(QWidget *parent = 0);
~DialogList();
private:
Ui::DialogList *ui;
QVector< bool> isShow;
};
#endif // DIALOGLIST_H
dialoglist.cpp
#include "dialoglist.h"
#include "ui_dialoglist.h"
#include <QToolButton>
#include "widget.h"
#include <QMessageBox>
DialogList::DialogList(QWidget *parent) :
QWidget(parent),
ui(new Ui::DialogList)
{
ui->setupUi(this);
//设置标题
setWindowTitle("MyChat");
//设置图标
setWindowIcon(QPixmap(":/images/qq.png"));
//准备图标
QList<QString>nameList;
nameList << "aaaaaa1111" << "aaaaaa2222" <<"aaaaaa3333"<<"aaaaaa4444"<<"aaaaaa5555"
<<"aaaaaa6666"<<"aaaaaa7777"<<"aaaaaa8888"<<"aaaaaa9999";
QStringList iconNameList; //图标资源列表
iconNameList << "ftbz"<< "ymrl" <<"qq" <<"Cherry"<< "dr"
<<"jj"<<"lswh"<<"qmnn"<<"wy";
QVector <QToolButton *> vToolBtn;
for(int i = 0; i < 9; i++)
{
//设置头像
QToolButton * btn = new QToolButton;
//设置文字
//btn->setText("aaaaaaa");
btn->setText(nameList[i]);
//设置头像
//btn->setIcon(QPixmap(":/images/ftbz.png"));
//设置头像
QString str = QString(":/images/%1.png").arg(iconNameList.at(i));
btn->setIcon(QPixmap(str));
//设置头像大小
btn->setIconSize(QPixmap(":/images/ftbz.png").size());
//设置按钮的风格 透明
btn->setAutoRaise(true);
//设置文字和图片一起显示
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//加到垂直布局中
ui->vLayout->addWidget(btn);
//将创建的button加入到容器中,保存储存的按钮
vToolBtn.push_back(btn);
//9个标示默认初始化
isShow.push_back(false);
}
//对9个按钮 进行添加信号槽
for(int i = 0 ; i < vToolBtn.size();i++)
{
connect(vToolBtn[i],&QToolButton::clicked,[=](){
//如果被打开了,就不要再次打开
if(isShow[i])
{
QString str = QString("%1窗口已经被打开了").arg(vToolBtn[i]->text());
QMessageBox::warning(this,"警告",str);
return;
}
isShow[i] = true;
//弹出聊天对话框
//构造聊天窗口时候 告诉这个窗口他的名字 参数1 顶层方式弹出 参数2 窗口名字
//注意! Widget构造函数 并没有这两个参数
Widget * widget = new Widget(0,vToolBtn[i]->text());
//设置窗口标题
widget->setWindowTitle(vToolBtn[i]->text());
widget->setWindowIcon(vToolBtn[i]->icon());
widget->show();
//监听窗口关闭的信息,发送者是widget发送的
connect(widget,&Widget::closeWidget,[=](){
isShow[i] = false;
});
});
}
}
DialogList::~DialogList()
{
delete ui;
}