update SelfInfoWidget

This commit is contained in:
xyz
2025-05-29 21:31:28 +08:00
parent beda1e32ad
commit 38f3a397fd
10 changed files with 283 additions and 44 deletions

9
.gitignore vendored
View File

@ -6,4 +6,11 @@ CMakeLists.txt.user
# 其他常见 IDE 文件(根据实际使用情况添加) # 其他常见 IDE 文件(根据实际使用情况添加)
.idea/ # CLion .idea/ # CLion
.vscode/ # VS Code .vscode/ # VS Code
.vs/ # Visual Studio .vs/ # Visual Studio
*.iml
*.user
*.suo
*.vsidx
*.ipch
cmake.db
slnx.sqlite

View File

@ -9,14 +9,31 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) # 查找Qt版本
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) 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 set(PROJECT_SOURCES
main.cpp main.cpp
mainwidget.cpp mainwidget.cpp
mainwidget.h mainwidget.h
mainwidget.ui 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) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
@ -24,45 +41,17 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
MANUAL_FINALIZATION MANUAL_FINALIZATION
${PROJECT_SOURCES} ${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() else()
if(ANDROID) if(ANDROID)
add_library(ClientChat SHARED add_library(ClientChat SHARED ${PROJECT_SOURCES})
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else() else()
add_executable(ClientChat add_executable(ClientChat ${PROJECT_SOURCES})
${PROJECT_SOURCES}
model/data.h
resource.qrc
sessionfriendarea.h sessionfriendarea.cpp
debug.h
messageshowarea.h messageshowarea.cpp
messageeditarea.h messageeditarea.cpp
)
endif() endif()
endif() endif()
target_link_libraries(ClientChat PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) target_link_libraries(ClientChat PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # Bundle设置
# 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
)
include(GNUInstallDirs) include(GNUInstallDirs)
install(TARGETS ClientChat install(TARGETS ClientChat

View File

@ -1,5 +1,6 @@
#include "mainwidget.h" #include "mainwidget.h"
#include <QApplication> #include <QApplication>
#include <QStyleFactory>
#include "model/data.h" #include "model/data.h"
@ -9,6 +10,10 @@ int main(int argc, char *argv[])
LOG() << "Hello"; LOG() << "Hello";
QPalette palette;
palette.setColor(QPalette::WindowText, Qt::black);// 窗口文字颜色
QApplication::setPalette(palette);
MainWidget* w = MainWidget::getInstance(); MainWidget* w = MainWidget::getInstance();
w->show(); w->show();
return a.exec(); return a.exec();

View File

@ -39,6 +39,7 @@ MainWidget::MainWidget(QWidget *parent)
initRightWindow(); initRightWindow();
//初始化信号槽 //初始化信号槽
initSignalSlot(); initSignalSlot();
} }
MainWidget::~MainWidget() MainWidget::~MainWidget()
@ -224,6 +225,17 @@ void MainWidget::initSignalSlot()
connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession); connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession);
connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend); connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend);
connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply); 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() void MainWidget::switchTabToSession()

View File

@ -8,6 +8,7 @@
#include "debug.h" #include "debug.h"
#include "messageeditarea.h" #include "messageeditarea.h"
#include "messageshowarea.h" #include "messageshowarea.h"
#include "SelfInfoWidget.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui {

View File

@ -1,5 +1,206 @@
#include "messageeditarea.h" #include "messageeditarea.h"
MessageEditArea::MessageEditArea(QWidget *parent) MessageEditArea::MessageEditArea(QWidget *parent)
: 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);
//}

View File

@ -1,14 +1,38 @@
#ifndef MESSAGEEDITAREA_H #ifndef MESSAGEEDITAREA_H
#define MESSAGEEDITAREA_H #define MESSAGEEDITAREA_H
#include <QWidget> #include <QWidget>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QScrollBar>
//#include <QGraphicsDropShadowEffect>
//#include <qpropertyanimation.h>
//#include <QEvent>
//编辑消息的区域
class MessageEditArea : public QWidget class MessageEditArea : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MessageEditArea(QWidget *parent = nullptr); 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: signals:
}; };

View File

@ -23,7 +23,7 @@ MessageShowArea::MessageShowArea() {
// 添加测试数据 // 添加测试数据
#if TEST_UI #if TEST_UI
bool k = true; bool k = true;
for(int i = 0; i < 30; i++) { for(int i = 0; i < 8; i++) {
model::UserInfo userInfo; model::UserInfo userInfo;
userInfo.nickname = "xyz" + QString::number(i); userInfo.nickname = "xyz" + QString::number(i);
userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png"); userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png");

View File

@ -142,7 +142,7 @@ void SessionFriendItem::mousePressEvent(QMouseEvent *event)
select(); select();
} }
void SessionFriendItem::enterEvent(QEvent *event) void SessionFriendItem::enterEvent(QEnterEvent *event)
{ {
(void) event; (void) event;

View File

@ -68,7 +68,7 @@ public:
//通过显式绘制控件的基础样式解决了自定义控件因未正确处理Qt样式表机制导致的QSS不生效问题 //通过显式绘制控件的基础样式解决了自定义控件因未正确处理Qt样式表机制导致的QSS不生效问题
void paintEvent(QPaintEvent* event) override; void paintEvent(QPaintEvent* event) override;
void mousePressEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override;
void enterEvent(QEvent* event) override; void enterEvent(QEnterEvent* event) override;
void leaveEvent(QEvent* event) override; void leaveEvent(QEvent* event) override;
void select(); void select();