qt小项目三 代码实现简易的QQ聊天界面的对话框弹出功能

2023-10-29

实现效果

点击成员列表中的头像,实现对应对话框弹出的功能。
打开的对话框不可以再次打开,同时弹出提示消息框。

打开一个窗口
在这里插入图片描述

再次打开该窗口

在这里插入图片描述

补充后的代码

myDialog.cpp文件中新增信号槽处理函数。
myDialog.h文件中新增窗口打开状态的标识符变量。
myWindow.cpp文件中重载窗口关闭函数。closeEvent();
myWindow.h文件中新增窗口关闭信号。

myDialog.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QToolButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QList>
#include <myWindow.h>

class MyDialog : public QWidget
{
    Q_OBJECT

public:
    MyDialog(QWidget *parent = nullptr);
    ~MyDialog();

private:

    QToolButton *textButton;
    QVBoxLayout *vLayout;
    QHBoxLayout *hLayout;
    QToolButton *userButton[9];
    QList<QString> nameList;
    QList<QString> picList;
    **QVector<bool> openState;**
};
#endif // MAINWINDOW_H

myDialog.cpp

#include "myDialog.h"
#include "myWindow.h"
#include <QPixmap>
#include <QIcon>
#include <QVector>
#include <QMessageBox>
#include <QDebug>

MyDialog::MyDialog(QWidget *parent)
    : QWidget(parent)
{
    this->setGeometry(200, 400, 250, 700);
    this->setWindowTitle("MyQQ 2020");
    textButton = new QToolButton();
    textButton->setText("群成员");
    textButton->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    vLayout = new QVBoxLayout(this);
    vLayout->addWidget(textButton);
    vLayout->setContentsMargins(0, 0, 0, 680);

    nameList << "nil" << "yingge" << "旧日暮里"
             << "戏班保洁" << "环球要饭集团"<< "财务"
             << "﹏沐.唐ゞ" << "萌新2号" << "森の妖精";

    picList << ":/img/1.jpg" << ":/img/2.jpg" << ":/img/3.jpg"
            << ":/img/4.jpg" << ":/img/5.jpg" << ":/img/6.jpg"
            << ":/img/7.jpg" << ":/img/8.jpg" << ":/img/9.jpg";

     QVector<QToolButton *> vToolButton;
    for(int i=0; i<9; i++)
    {
        userButton[i] = new QToolButton();

        userButton[i]->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        userButton[i]->setText(nameList[i]);
        userButton[i]->setAutoRaise(true);
        userButton[i]->setIcon(QPixmap(picList[i]));
        userButton[i]->setIconSize(QSize(50, 50));
        vToolButton.push_back(userButton[i]);
        **openState.push_back(false);**
        vLayout->addWidget(userButton[i]);
    }

    **for(int i=0; i<vToolButton.size(); i++)
    {
        connect(vToolButton[i], &QToolButton::clicked, [=](){
            if(openState[i] == true)
            {
                QString str =QString("%1窗口已经被打开了").arg(vToolButton[i]->text());
                QMessageBox::warning(this, "warning", str);
                return ;
            }
            myWindow *userWindow = new myWindow();
            userWindow->setWindowTitle(vToolButton[i]->text());
            userWindow->setWindowIcon(vToolButton[i]->icon());
            openState[i] = true;
            userWindow->show();
            connect(userWindow, &myWindow::closeMyWindow, [=]()
            {
                qDebug() <<"hello" <<endl;
                openState[i] = false;
            });
        });
    }**
}

MyDialog::~MyDialog()
{
}

myWindow.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QToolButton>
#include <QTextBrowser>
#include <QTextEdit>
#include <QPushButton>
#include <QSpacerItem>
#include <QComboBox>
#include <QSpinBox>
#include <QFontComboBox>
#include <QTableWidget>

class myWindow: public QWidget
{
    Q_OBJECT

public:
    myWindow(QWidget *parent = nullptr);
    ~myWindow();

private:

    QTextBrowser * msgBrowser;
    QTextEdit * msgTextEdit;
    QFontComboBox *fontBox;
    QSpinBox *fontSizeBox;
    QPushButton *underlineBn;
    QPushButton *boldBn;
    QPushButton *saveBn;
    QPushButton *clearBn;
    QPushButton *colorBn;
    QPushButton *tiltBn;
    QPushButton *sendBn;
    QPushButton *exitBn;
    QLabel *onlineNum;
    QSpacerItem *spacer[2];
    QTableWidget *tableWidget;
    QHBoxLayout *hLayout[3];
    QVBoxLayout *vLayout;
    void paintEvent(QPaintEvent *event);

**signals:
    void  closeMyWindow();
public :
     void closeEvent(QCloseEvent *event);**
};

#endif // WINDOW_H

myWindow.cpp

#include "myWindow.h"
#include <QFrame>
#include <QPainter>
#include <QPaintEvent>
#include <QSpacerItem>

myWindow::myWindow(QWidget *parent)
    : QWidget(parent)
{

    this->setGeometry(500, 500, 730, 450);
    msgBrowser = new QTextBrowser();
    msgTextEdit = new QTextEdit();
    fontBox = new QFontComboBox();
    fontSizeBox = new QSpinBox();
    underlineBn = new QPushButton();
    boldBn = new QPushButton();
    saveBn = new QPushButton();
    clearBn = new QPushButton();
    colorBn = new QPushButton();
    tiltBn = new QPushButton();
    sendBn = new QPushButton();
    exitBn = new QPushButton();
    onlineNum = new QLabel();
    tableWidget = new QTableWidget(0, 1);


    msgTextEdit->setMaximumHeight(100);
    boldBn->setMaximumSize(33, 32);
    boldBn->setIconSize(QSize(26, 26));
    boldBn->setCheckable(true);
    boldBn->setIcon(QPixmap(":/img/bold.png"));

    underlineBn->setMaximumSize(33, 32);
    underlineBn->setIconSize(QSize(26, 26));
    underlineBn->setCheckable(true);
    underlineBn->setIcon(QPixmap(":/img/underline.png"));

    saveBn->setMaximumSize(33, 32);
    saveBn->setIconSize(QSize(26, 26));
    saveBn->setCheckable(true);
    saveBn->setIcon(QPixmap(":/img/save.png"));

    clearBn->setMaximumSize(33, 32);
    clearBn->setIconSize(QSize(26, 26));
    clearBn->setCheckable(true);
    clearBn->setIcon(QPixmap(":/img/clear.png"));

    colorBn->setMaximumSize(33, 32);
    colorBn->setIconSize(QSize(26, 26));
    colorBn->setCheckable(true);
    colorBn->setIcon(QPixmap(":/img/color.png"));

    tiltBn->setMaximumSize(33, 32);
    tiltBn->setIconSize(QSize(26, 26));
    tiltBn->setCheckable(true);
    tiltBn->setIcon(QPixmap(":/img/tilt.png"));

    sendBn->setText("发送");
    exitBn->setText("退出");
    onlineNum->setText("当前在线人数:0人");

    tableWidget->setMinimumWidth(180);
//    tableWid
    QStringList header;
    header << "用户名";
    tableWidget->setHorizontalHeaderLabels(header);
    tableWidget->setShowGrid(false);
    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//选中行为为一行
    tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//单行选中
    tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tableWidget->setFocusPolicy(Qt::NoFocus);//不设置鼠标焦点,不会出现某一行高亮的同时,鼠标所在单元格别选中高亮的情况


    hLayout[0] = new QHBoxLayout();
    hLayout[0]->addWidget(fontBox);
    hLayout[0]->addWidget(fontSizeBox);
    hLayout[0]->addWidget(underlineBn);
    hLayout[0]->addWidget(boldBn);
    hLayout[0]->addWidget(tiltBn);
    hLayout[0]->addWidget(colorBn);
    hLayout[0]->addWidget(saveBn);
    hLayout[0]->addWidget(clearBn);

    hLayout[1] = new QHBoxLayout();
    hLayout[1]->addWidget(sendBn);
//    hLayout[1]->addSpacerItem(space1);
    hLayout[1]->addWidget(onlineNum);
//    hLayout[1]->addSpacerItem(space2);
    hLayout[1]->addWidget(exitBn);

    vLayout = new QVBoxLayout();
    vLayout->addWidget(msgBrowser);
    vLayout->addLayout(hLayout[0]);
    vLayout->addWidget(msgTextEdit);
    vLayout->addLayout(hLayout[1]);

    hLayout[2] = new QHBoxLayout();
    hLayout[2]->addLayout(vLayout);
    hLayout[2]->addWidget(tableWidget);

    this->setLayout(hLayout[2]);

}

myWindow::~myWindow()
{}

void myWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.setPen(QColor(Qt::black));
    painter.drawRect(10, this->height()-204, this->width()-212 ,38);
    painter.drawRect(10, 10, this->width()-212, this->height()-65);
}

**void myWindow::closeEvent(QCloseEvent *event)
{
    Q_UNUSED(event)
    emit closeMyWindow();
}**

总结

当前的项目中涉及了封装控件功能的实现。在封装的控件中涉及绘画事件重载,窗口关闭重载。跨窗口实现信号接收处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt小项目三 代码实现简易的QQ聊天界面的对话框弹出功能 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • AOP的切入点Pointcut中的execution表达式详解

    在面向切面编程 AOP 中 切入点 Pointcut 用于定义在哪些方法或代码段上应该应用切面的逻辑 切入点使用表达式来匹配目标方法的签名和执行位置 在 Spring AOP 中 常用的切入点表达式是基于方法的 execution 表达式
  • 理解Vulkan中的各种对象

    学习Vulkan API的一个重要部分是了解其中定义了哪些类型的对象 它们代表了什么 以及它们如何相互关联 为了帮助解决这个问题 创建了一个图表 展示了所有vulkan对象及其一些关系 尤其是从另一个对象创建对象的顺序 每个vulkan对象
  • java中局部变量、全局变量和static的区别(简单易懂)

    java中的变量类型有 1 类变量 独立于方法之外的变量 用 static 修饰 2 实例变量 独立于方法之外的变量 不过没有 static 修饰 3 局部变量 类的方法中的变量 比如 Java 局部变量 局部变量声明在方法 构造方法或者语
  • 回调函数的原理及运用

    第一个问题 什么是回调函数 来看一下百度百科的定义为 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 回调函数不是由该函数的实现方直接调
  • hadoop环境搭建之安装JDK

    判断是否安装了jdk 使用java version 和 javac命令判断是否安装了jdk root localhost ssh java version bash java command not found root localhost
  • 【重铸Java根基】为什么Java中只有值传递

    最近带应届新员工 教然后知不足 发现自己把很多基础知识已经还给了大学老师 因此开贴 温故而知新 从最基础的Java知识开始由浅入深 在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开 先要搞清楚什么是形参 什么是实参 形参 定义方
  • 寄存器的映射过程

  • vue学习-02vue入门之组件

    删除Vue cli预设 在用户根目录下 C Users 你的用户名 这个地址里有一个 vuerc 文件 修改或删除配置 组件 Props 组件之间的数据传递 Prop 的大小写 camelCase vs kebab case 不敏感 Pro
  • 线程同步概念

    带着问题去思考 什么是线程同步 线程同步能解决哪些问题 如何实现线程同步 线程同步是指两个或多个线程协同步调 按预期的顺序执行代码 若两个或多个线程同时写同一块内存或访问同一资源时 需线程同步 若线程A的执行依赖线程B的结果 需线程同步 输
  • 在外部js文件中直接调用vue文件中自定义的方法

    1 在vue文件引入API import getCurrentInstance onMounted from vue onMounted 用于挂载数据 getCurrentInstance 用于获取实例后再使用 2 定义setup 方法 s
  • vue——组件中的样式改变方法

    一般我们自己封装的组件或者组件库 element vant antdesign 中的样式在页面中必要的时候需要改变时 解决方法如下 解决方法 在页面中重新写一个 不要改成局部的 scope 页面中全局修改 在上一部的中 改变组件样式时 要先
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • whois命令简介

    whois命令简介 一 概述 whois是Linux Unix环境下的命令 按字面意思就是问 他是谁 通过对域名的检索 可以反馈回域名的注册信息 包括持有人 管理资料以及技术联络资料 也包括该域名的域名服务器 但是在世界上有几个主要的who
  • Contest2967 - 2022-2023-2 ACM集训队每周程序设计竞赛(1)

    问题 C 付哥题做不完了 内存限制 1024 MB时间限制 2 000 S评测方式 文本比较命题人 admin提交 323解决 44 返回比赛提交提交记录侧边提交 题目描述 付哥今天在做题 他有两个题单A和B 里面的题目数量分别为n和m 每
  • 数据库语法时用到的{},,[]等各类括号分别代表什么?

    lt gt 尖括号 用于分隔字符串 字符串为语法元素的名称 SQL语言的非终结符 定义操作符 用在生成规则中 分隔规则定义的元素和规则定义 被定义的元素位于操作符的左边 规则定义位于操作符的右边 方括号表示规则中的可选元素 方括号中的规则部
  • 推荐一些好用的小技巧给你

    技巧一 微信设置通话铃声 微信 作为一款主打移动通信的软件 没有自己专属的通话 彩铃 是否有些说不过去呢 所以我们可以在微信设置中 添加自己专属的 通话铃声 这样无论哪个好友拨打 微信电话 给你 都能听到你设置的 通话铃声 啦 操作指南 打
  • VC6添加自定义消息(主窗口向子窗口发送消息)

    从主窗口向子窗口发送消息 可以在子窗口中添加自定义的消息 然后在主窗口中需要地方呼叫该消息 呼叫方法 1 将子窗口添加为主窗口的成员变量 2 主窗口呼叫该消息 成员变量名 SendMessage UM PROGRESS 子窗口添加自定义消息
  • 连接Mysql数据库的报错: java.sql.SQLException: Unknown initial character set index ‘255’ received from server

    连接Mysql数据库的报错 java sql SQLException Unknown initial character set index 255 received from server Initial client characte
  • 树(Tree)——(一)基础知识

    目录 关于树的术语 儿子兄弟链式表示法 二叉树概念和基本特征 二叉树的形态 前序 中序 后序遍历特性 习题梳理 树存在的主要意义就是为了方便查找 如二叉树就有二分的思想 关于树的术语 1 结点的度 Degree 结点的子树个数 例如上面的图
  • qt小项目三 代码实现简易的QQ聊天界面的对话框弹出功能

    实现效果 点击成员列表中的头像 实现对应对话框弹出的功能 打开的对话框不可以再次打开 同时弹出提示消息框 打开一个窗口 再次打开该窗口 补充后的代码 myDialog cpp文件中新增信号槽处理函数 myDialog h文件中新增窗口打开状