23.Qt-MyChat03对话框列表弹出聊天窗口

点击按钮弹出窗口
    点击按钮创建窗口
        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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值