From 38f3a397fd0329b16ad57f178a26bc482d2050a8 Mon Sep 17 00:00:00 2001 From: xyz <2050965275@qq.com> Date: Thu, 29 May 2025 21:31:28 +0800 Subject: [PATCH] update SelfInfoWidget --- .gitignore | 9 +- CMakeLists.txt | 63 ++++++------- main.cpp | 5 ++ mainwidget.cpp | 12 +++ mainwidget.h | 1 + messageeditarea.cpp | 205 +++++++++++++++++++++++++++++++++++++++++- messageeditarea.h | 26 +++++- messageshowarea.cpp | 2 +- sessionfriendarea.cpp | 2 +- sessionfriendarea.h | 2 +- 10 files changed, 283 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index cc4e6e1..c9c9429 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,11 @@ CMakeLists.txt.user # 其他常见 IDE 文件(根据实际使用情况添加) .idea/ # CLion .vscode/ # VS Code -.vs/ # Visual Studio \ No newline at end of file +.vs/ # Visual Studio +*.iml +*.user +*.suo +*.vsidx +*.ipch +cmake.db +slnx.sqlite \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 1541e44..695fe12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,14 +9,31 @@ set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) -find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) +# 查找Qt版本 +find_package(Qt6 COMPONENTS Widgets QUIET) +if(NOT Qt6_FOUND) + find_package(Qt5 COMPONENTS Widgets REQUIRED) + set(QT_VERSION_MAJOR 5) +else() + set(QT_VERSION_MAJOR 6) +endif() set(PROJECT_SOURCES - main.cpp - mainwidget.cpp - mainwidget.h - mainwidget.ui + main.cpp + mainwidget.cpp + mainwidget.h + mainwidget.ui + model/data.h + resource.qrc + sessionfriendarea.h + sessionfriendarea.cpp + debug.h + messageshowarea.h + messageshowarea.cpp + messageeditarea.h + messageeditarea.cpp + SelfInfoWidget.h + SelfInfoWidget.cpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) @@ -24,45 +41,17 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) MANUAL_FINALIZATION ${PROJECT_SOURCES} ) -# Define target properties for Android with Qt 6 as: -# set_property(TARGET ClientChat APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR -# ${CMAKE_CURRENT_SOURCE_DIR}/android) -# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation else() if(ANDROID) - add_library(ClientChat SHARED - ${PROJECT_SOURCES} - ) -# Define properties for Android with Qt 5 after find_package() calls as: -# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") + add_library(ClientChat SHARED ${PROJECT_SOURCES}) else() - add_executable(ClientChat - ${PROJECT_SOURCES} - model/data.h - resource.qrc - sessionfriendarea.h sessionfriendarea.cpp - debug.h - messageshowarea.h messageshowarea.cpp - messageeditarea.h messageeditarea.cpp - ) + add_executable(ClientChat ${PROJECT_SOURCES}) endif() endif() target_link_libraries(ClientChat PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) -# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. -# If you are developing for iOS or macOS you should consider setting an -# explicit, fixed bundle identifier manually though. -if(${QT_VERSION} VERSION_LESS 6.1.0) - set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.ClientChat) -endif() -set_target_properties(ClientChat PROPERTIES - ${BUNDLE_ID_OPTION} - MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} - MACOSX_BUNDLE TRUE - WIN32_EXECUTABLE TRUE -) +# Bundle设置(略) include(GNUInstallDirs) install(TARGETS ClientChat diff --git a/main.cpp b/main.cpp index ba59c7c..8aeaf29 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,6 @@ #include "mainwidget.h" #include +#include #include "model/data.h" @@ -9,6 +10,10 @@ int main(int argc, char *argv[]) LOG() << "Hello"; + QPalette palette; + palette.setColor(QPalette::WindowText, Qt::black);// 窗口文字颜色 + QApplication::setPalette(palette); + MainWidget* w = MainWidget::getInstance(); w->show(); return a.exec(); diff --git a/mainwidget.cpp b/mainwidget.cpp index e9340d7..4d87756 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -39,6 +39,7 @@ MainWidget::MainWidget(QWidget *parent) initRightWindow(); //初始化信号槽 initSignalSlot(); + } MainWidget::~MainWidget() @@ -224,6 +225,17 @@ void MainWidget::initSignalSlot() connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession); connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend); connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply); + + + ///////////////////////////////////// + // 点击自己的头像,弹出对话框显示个人的主页 + ///////////////////////////////////// + connect(userAvatar, &QPushButton::clicked, this, [=]()->void { + SelfInfoWidget* selfInfoWidget = new SelfInfoWidget(this); + selfInfoWidget->setStyleSheet("QDialog { background-color: rgb(255, 255, 255); }"); + selfInfoWidget->exec(); //弹出模态对话框 + //selfInfoWidget->show(); //弹出非模态对加框 + }); } void MainWidget::switchTabToSession() diff --git a/mainwidget.h b/mainwidget.h index d11f35d..aba34a2 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -8,6 +8,7 @@ #include "debug.h" #include "messageeditarea.h" #include "messageshowarea.h" +#include "SelfInfoWidget.h" QT_BEGIN_NAMESPACE namespace Ui { diff --git a/messageeditarea.cpp b/messageeditarea.cpp index 0e4d0f5..3ece097 100644 --- a/messageeditarea.cpp +++ b/messageeditarea.cpp @@ -1,5 +1,206 @@ -#include "messageeditarea.h" +#include "messageeditarea.h" + MessageEditArea::MessageEditArea(QWidget *parent) : QWidget{parent} -{} +{ + //设置必要的属性 + this->setFixedHeight(250); + this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + //创建垂直方向的布局管理器 + QVBoxLayout* vlayout = new QVBoxLayout(); + vlayout->setSpacing(0); + vlayout->setContentsMargins(0, 0, 30, 10); + this->setLayout(vlayout); + + //创建水平方向的布局管理器 + QHBoxLayout* hlayout = new QHBoxLayout(); + hlayout->setSpacing(0); + hlayout->setContentsMargins(10, 0, 0, 0); + hlayout->setAlignment(Qt::AlignLeft | Qt::AlignTop); + vlayout->addLayout(hlayout); + + //将上方的四个按钮,创建好并添加到layout中 + QString btnStyle = R"(QPushButton { background-color: rgb(245, 245, 245); border: none; } + QPushButton:pressed {background-color: rgb(255, 255, 255); })"; + QSize btnSize(35, 35); + QSize iconSize(25, 25); + + sendImageBtn = new QPushButton(); + sendImageBtn->setFixedSize(btnSize); + sendImageBtn->setIconSize(iconSize); + sendImageBtn->setIcon(QIcon(":/resource/image/image.png")); + sendImageBtn->setStyleSheet(btnStyle); + hlayout->addWidget(sendImageBtn); + + sendFileBtn = new QPushButton(); + sendFileBtn->setFixedSize(btnSize); + sendFileBtn->setIconSize(iconSize); + sendFileBtn->setIcon(QIcon(":/resource/image/file.png")); + sendFileBtn->setStyleSheet(btnStyle); + hlayout->addWidget(sendFileBtn); + + sendSpeechBtn = new QPushButton(); + sendSpeechBtn->setFixedSize(btnSize); + sendSpeechBtn->setIconSize(iconSize); + sendSpeechBtn->setIcon(QIcon(":/resource/image/sound.png")); + sendSpeechBtn->setStyleSheet(btnStyle); + hlayout->addWidget(sendSpeechBtn); + + showHistoryBtn = new QPushButton(); + showHistoryBtn->setFixedSize(btnSize); + showHistoryBtn->setIconSize(iconSize); + showHistoryBtn->setIcon(QIcon(":/resource/image/history.png")); + showHistoryBtn->setStyleSheet(btnStyle); + hlayout->addWidget(showHistoryBtn); + + //添加多行编辑框 + textEdit = new QPlainTextEdit(); + textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + textEdit->setStyleSheet(R"( QPlainTextEdit { + color: black; + border: none; + background-color: transparent; + font-size: 14px; + padding: 10px; } +)"); + textEdit->verticalScrollBar()->setStyleSheet(R"( + QScrollBar:vertical { + background-color: rgb(228, 228, 228); /* 滚动条背景透明 */ + width: 6px; /* 默认宽度 */ + margin: 0px 0px 0px 0px; /* 边距清零 */ + } + QScrollBar::handle:vertical { + background: #CCCCCC; /* 滑块颜色(浅灰色) */ + min-height: 30px; /* 滑块最小高度 */ + border-radius: 3px; /* 圆角 */ + } + QScrollBar::handle:vertical:hover { + background: #999999; /* 悬停时滑块颜色加深 */ + width: 10px; /* 悬停时宽度增大 */ + } + QScrollBar::handle:vertical:pressed { + background: #666666; /* 按下时颜色更深 */ + } + QScrollBar::add-line:vertical, + QScrollBar::sub-line:vertical { + height: 0px; /* 隐藏上下箭头按钮 */ + background: none; + } + QScrollBar::add-page:vertical, + QScrollBar::sub-page:vertical { + background: none; /* 滚动条背景区域透明 */ + } + +)"); + + vlayout->addWidget(textEdit); + + + //添加发送消息文本的按钮 + sendTextButton = new QPushButton(); + sendTextButton->setText("发送"); + sendTextButton->setFixedSize(120, 40); + //仿Wechat的标准样式 + sendTextButton->setStyleSheet(R"(QPushButton { + font-size: 16px; + color: rgb(7, 193, 96); + border: none; + background-color: rgb(233, 233, 233); + border-radius: 5px; } + QPushButton:hover { + background-color: rgb(210, 210, 210); } + QPushButton:pressed { + background-color: rgb(190, 190, 190); } +)"); + + +//// 创建阴影效果 +// shadowEffect = new QGraphicsDropShadowEffect; +// shadowEffect->setBlurRadius(12); +// shadowEffect->setOffset(0, 5); +// shadowEffect->setColor(QColor(0, 0, 0, 150)); +// sendTextButton->setGraphicsEffect(shadowEffect); +// +//// 设置按钮样式表 +// sendTextButton->setStyleSheet(R"( +// QPushButton { +// background: qlineargradient(spread:pad, +// x1:0, y1:0, x2:1, y2:0, +// stop:0 #9b59b6, +// stop:1 #8e44ad); +// border-radius: 10px; +// color: white; +// font: bold 14px; +// border: none; +// margin: 5px; +// box-shadow: 0 5px 15px rgba(0,0,0,0.3); +// } +// QPushButton:hover { +// background: qlineargradient(spread:pad, +// x1:0, y1:0, x2:1, y2:0, +// stop:0 #e67e22, +// stop:1 #d35400); +// box-shadow: 0 7px 20px rgba(0,0,0,0.4); +// } +// QPushButton:pressed { +// background: qlineargradient(spread:pad, +// x1:0, y1:0, x2:1, y2:0, +// stop:0 #e74c3c, +// stop:1 #c0392b); +// } +//)"); +// +// // 连接按钮的按下和释放事件 +// connect(sendTextButton, &QPushButton::pressed, [=]() { +// QPropertyAnimation* anim = new QPropertyAnimation(shadowEffect, "offset"); +// anim->setDuration(100); +// anim->setStartValue(shadowEffect->offset()); +// anim->setEndValue(QPointF(0, 1)); +// anim->start(QAbstractAnimation::DeleteWhenStopped); +// }); +// +// connect(sendTextButton, &QPushButton::released, [=]() { +// QPropertyAnimation* anim = new QPropertyAnimation(shadowEffect, "offset"); +// anim->setDuration(150); +// anim->setStartValue(shadowEffect->offset()); +// anim->setEndValue(QPointF(0, sendTextButton->underMouse() ? 3 : 5)); // 根据是否悬停决定最终位置 +// anim->setEasingCurve(QEasingCurve::OutBack); +// anim->start(QAbstractAnimation::DeleteWhenStopped); +// }); +// +// // 安装事件过滤器 +// sendTextButton->installEventFilter(this); + + + + vlayout->addWidget(sendTextButton, 0, Qt::AlignRight | Qt::AlignVCenter); + +} + + +//bool MessageEditArea::eventFilter(QObject* obj, QEvent* event) +//{ +// if (obj == sendTextButton) { +// if (event->type() == QEvent::Enter) { +// // 鼠标进入事件 +// QPropertyAnimation* hoverAnim = new QPropertyAnimation(shadowEffect, "offset"); +// hoverAnim->setDuration(200); +// hoverAnim->setStartValue(shadowEffect->offset()); +// hoverAnim->setEndValue(QPointF(0, 3)); +// hoverAnim->start(QAbstractAnimation::DeleteWhenStopped); +// return true; +// } +// else if (event->type() == QEvent::Leave) { +// // 鼠标离开事件 +// QPropertyAnimation* hoverAnim = new QPropertyAnimation(shadowEffect, "offset"); +// hoverAnim->setDuration(200); +// hoverAnim->setStartValue(shadowEffect->offset()); +// hoverAnim->setEndValue(QPointF(0, 5)); +// hoverAnim->start(QAbstractAnimation::DeleteWhenStopped); +// return true; +// } +// } +// return QObject::eventFilter(obj, event); +//} \ No newline at end of file diff --git a/messageeditarea.h b/messageeditarea.h index 8638e13..d168201 100644 --- a/messageeditarea.h +++ b/messageeditarea.h @@ -1,14 +1,38 @@ -#ifndef MESSAGEEDITAREA_H +#ifndef MESSAGEEDITAREA_H #define MESSAGEEDITAREA_H #include +#include +#include +#include +#include +#include +//#include +//#include +//#include +//编辑消息的区域 class MessageEditArea : public QWidget { Q_OBJECT public: explicit MessageEditArea(QWidget *parent = nullptr); + //花式按钮事件 + //bool eventFilter(QObject* obj, QEvent* event) override; + +private: + QPushButton* sendImageBtn; + QPushButton* sendFileBtn; + QPushButton* sendSpeechBtn; + QPushButton* showHistoryBtn; + QPlainTextEdit* textEdit; + QPushButton* sendTextButton; + + //花式按钮 + //QGraphicsDropShadowEffect* shadowEffect; + + signals: }; diff --git a/messageshowarea.cpp b/messageshowarea.cpp index 0d3b15f..0aa2853 100644 --- a/messageshowarea.cpp +++ b/messageshowarea.cpp @@ -23,7 +23,7 @@ MessageShowArea::MessageShowArea() { // 添加测试数据 #if TEST_UI bool k = true; - for(int i = 0; i < 30; i++) { + for(int i = 0; i < 8; i++) { model::UserInfo userInfo; userInfo.nickname = "xyz" + QString::number(i); userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png"); diff --git a/sessionfriendarea.cpp b/sessionfriendarea.cpp index 5f5e60d..4a522c3 100644 --- a/sessionfriendarea.cpp +++ b/sessionfriendarea.cpp @@ -142,7 +142,7 @@ void SessionFriendItem::mousePressEvent(QMouseEvent *event) select(); } -void SessionFriendItem::enterEvent(QEvent *event) +void SessionFriendItem::enterEvent(QEnterEvent *event) { (void) event; diff --git a/sessionfriendarea.h b/sessionfriendarea.h index 9e2cc31..36710ff 100644 --- a/sessionfriendarea.h +++ b/sessionfriendarea.h @@ -68,7 +68,7 @@ public: //通过显式绘制控件的基础样式,解决了自定义控件因未正确处理Qt样式表机制导致的QSS不生效问题 void paintEvent(QPaintEvent* event) override; void mousePressEvent(QMouseEvent* event) override; - void enterEvent(QEvent* event) override; + void enterEvent(QEnterEvent* event) override; void leaveEvent(QEvent* event) override; void select();