diff --git a/TcpClient.pro b/TcpClient.pro index a4a2238..e91fa06 100644 --- a/TcpClient.pro +++ b/TcpClient.pro @@ -1,4 +1,4 @@ -QT += core gui network +QT += core gui network multimedia greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -38,5 +38,5 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin RESOURCES += \ imgs/imgs.qrc -RC_ICON = imgs/exeicon.ico -RC_FILE += imgs/exeicon.rc +RC_ICON = imgs/icon.ico +RC_FILE += imgs/icon.rc diff --git a/datamanager.cpp b/datamanager.cpp index 793d1f9..04cac9a 100644 --- a/datamanager.cpp +++ b/datamanager.cpp @@ -47,6 +47,7 @@ void DataManager::recv_from_server(QByteArray data) QJsonDocument json_data = QJsonDocument::fromJson(list[i]); if (json_data["type"] == "message") { + emit new_message(); QString data, sendname; sendname = json_data["sendname"].toString(); data = json_data["data"].toString(); @@ -55,6 +56,7 @@ void DataManager::recv_from_server(QByteArray data) } else if (json_data["type"] == "file") { + emit new_message(); QString filename, file_data, sendname; sendname = json_data["sendname"].toString(); filename = json_data["name"].toString(); diff --git a/datamanager.h b/datamanager.h index 454456a..465d57a 100644 --- a/datamanager.h +++ b/datamanager.h @@ -26,6 +26,7 @@ private: signals: void connect_to_server(); void disconnect_from_server(); + void new_message(); void signin_response(bool result); void signup_response(bool result); void update_text(QString sendname,QString data); diff --git a/imgs/empty.png b/imgs/empty.png new file mode 100644 index 0000000..4788d15 Binary files /dev/null and b/imgs/empty.png differ diff --git a/imgs/exeicon.ico b/imgs/exeicon.ico deleted file mode 100644 index 5b3d3d6..0000000 Binary files a/imgs/exeicon.ico and /dev/null differ diff --git a/imgs/exeicon.rc b/imgs/exeicon.rc deleted file mode 100644 index 8aa6f8c..0000000 --- a/imgs/exeicon.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "exeicon.ico" \ No newline at end of file diff --git a/imgs/icon.png b/imgs/icon.png index fee8ac3..a176fed 100644 Binary files a/imgs/icon.png and b/imgs/icon.png differ diff --git a/imgs/imgs.qrc b/imgs/imgs.qrc index f872d2d..5b4f6e1 100644 --- a/imgs/imgs.qrc +++ b/imgs/imgs.qrc @@ -11,5 +11,7 @@ save.png send.png text.png + empty.png + remind.wav diff --git a/imgs/remind.wav b/imgs/remind.wav new file mode 100644 index 0000000..d6313e5 Binary files /dev/null and b/imgs/remind.wav differ diff --git a/login.cpp b/login.cpp index cd7bd27..adad8c4 100644 --- a/login.cpp +++ b/login.cpp @@ -178,6 +178,7 @@ void Login::signin_response(bool result) connect(datamanager,&DataManager::update_file_private,mainwidget,&MainWidget::update_file_private); connect(datamanager,&DataManager::update_users,mainwidget,&MainWidget::update_users); connect(datamanager,&DataManager::disconnect_from_server,mainwidget,&MainWidget::disconnect_form_server); + connect(datamanager,&DataManager::new_message,mainwidget,&MainWidget::slot_new_message); connect(mainwidget,&MainWidget::exit_client,this,&Login::exit_client); this->hide(); mainwidget->show(); diff --git a/mainwidget.cpp b/mainwidget.cpp index 0c15374..05b9ee2 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -46,6 +46,12 @@ MainWidget::MainWidget(QString username,QWidget *parent) : ui->save_btn->setMouseTracking(true); ui->save_btn->setToolTip(QStringLiteral("保存聊天记录")); + CreateSystemTray(); + effect = new QSoundEffect(this); + effect->setSource(QUrl("qrc:/remind.wav")); + effect->setLoopCount(1); + effect->setVolume(0.95f); + ui->msg_edit->installEventFilter(this);//设置完后自动调用其eventFilter函数 this->username = username; } @@ -172,8 +178,7 @@ void MainWidget::on_send_btn_clicked() { zoom_down(ui->send_btn); zoom_up(ui->send_btn); - QString text; - text = ui->msg_edit->text(); + QString text = ui->msg_edit->text(); if(text.isEmpty()) { QMessageBox::warning(this, "发送失败", "输入不能为空!"); @@ -342,6 +347,43 @@ void MainWidget::disconnect_form_server() QMessageBox::critical(this,"连接超时","请检查您的网络连接!"); qApp->quit(); } + +void MainWidget::slot_new_message() +{ + emit new_message(); +} + +void MainWidget::message_reminder() +{ + QApplication::alert(this);// 任务栏通知 + ui->textEdit->append("    " + "       " + "—————————以下是新消息—————————\n"); + disconnect(this,&MainWidget::new_message,this,&MainWidget::message_reminder); + if (TimerFlash == NULL) + { + flashCount = 0; + TimerFlash = new QTimer(this); + connect(TimerFlash, &QTimer::timeout, this, &MainWidget::onFlashTimerOut); + TimerFlash->start(500); + } +} + +void MainWidget::onFlashTimerOut() +{ + flashCount++; + if (flashCount % 2 == 1) + { + SystemTray->setIcon(QIcon(":/empty.png")); + + } + else + { + SystemTray->setIcon(QIcon(":/icon.png")); + } + +} + void MainWidget::sendFile(QString filePath,QString filename,QString name) { QFile file(filePath); @@ -412,6 +454,79 @@ void MainWidget::readFile(QString filename,QByteArray data) } } +void MainWidget::CreateSystemTray() +{ + //创建菜单对象和托盘图标对象 + TrayMennu = new QMenu(this); + SystemTray = new QSystemTrayIcon(this); + + //创建菜单项 + ActionShow = new QAction(tr("Show"), this); + ActionQuit = new QAction(tr("Exit"), this); + connect(ActionShow,&QAction::triggered,this,[=](){ + if(this->isMinimized()) + { + this->showNormal(); + } + this->show(); + //SystemTray->hide(); + }); + connect(ActionQuit,&QAction::triggered,this,[=](){ + qApp->quit(); + }); + connect(SystemTray,&QSystemTrayIcon::activated,this,[=](){ + if(this->isMinimized()) + { + this->showNormal(); + } + this->show(); + //SystemTray->hide(); + }); + + //添加菜单项 + TrayMennu->addAction(ActionShow); + TrayMennu->addSeparator(); + TrayMennu->addAction(ActionQuit); + + //为系统托盘设置菜单为m_pTrayMennu + SystemTray->setContextMenu(TrayMennu); + SystemTray->setIcon(QIcon(":/icon.png")); + + SystemTray->show(); +} + +void MainWidget::zoom_down(QPushButton* btn) +{ + QPointer animalton(new QPropertyAnimation(btn,"geometry")); + animalton->setDuration(150); + animalton->setStartValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); + animalton->setEndValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); + animalton->setEasingCurve(QEasingCurve::OutBounce); + animalton->start(); + +} + +void MainWidget::zoom_up(QPushButton* btn) +{ + QPointer animalton(new QPropertyAnimation(btn,"geometry")); + animalton->setDuration(150); + animalton->setStartValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); + animalton->setEndValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); + animalton->setEasingCurve(QEasingCurve::OutBounce); + animalton->start(); +} + +void MainWidget::changeEvent(QEvent *event) +{ + if(event->type()!=QEvent::WindowStateChange) + return; + if(this->windowState()==Qt::WindowMinimized) + { + connect(this,&MainWidget::new_message,this,&MainWidget::message_reminder); + connect(this,&MainWidget::new_message,effect, &QSoundEffect::play); + } +} + bool MainWidget::eventFilter(QObject *target, QEvent *event) { if(target == ui->msg_edit) //可替换 @@ -430,59 +545,16 @@ bool MainWidget::eventFilter(QObject *target, QEvent *event) return QWidget::eventFilter(target,event); } -void MainWidget::CreatSystemTray() +void MainWidget::showEvent(QShowEvent *event) { - //创建菜单对象和托盘图标对象 - QPointer TrayMennu(new QMenu(this)); - QPointer SystemTray(new QSystemTrayIcon(this)); - - //创建菜单项 - QPointer ActionShow(new QAction(tr("Show"), this)); - QPointer ActionQuit(new QAction(tr("Exit"), this)); - connect(ActionShow,&QAction::triggered,this,[=](){ - this->show(); - SystemTray->hide(); - }); - connect(ActionQuit,&QAction::triggered,this,[=](){ - this->close(); - }); - connect(SystemTray,&QSystemTrayIcon::activated,this,[=](){ - this->show(); - SystemTray->hide(); - }); - - //添加菜单项 - TrayMennu->addAction(ActionShow); - TrayMennu->addSeparator(); - TrayMennu->addAction(ActionQuit); - - //为系统托盘设置菜单为m_pTrayMennu - SystemTray->setContextMenu(TrayMennu); - SystemTray->setIcon(QIcon(":/icon.png")); - - SystemTray->show(); - //this->setWindowFlags(Qt::Tool); -} - -void MainWidget::zoom_down(QPushButton* btn) -{ - QScopedPointer animalton(new QPropertyAnimation(btn,"geometry")); - animalton->setDuration(150); - animalton->setStartValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); - animalton->setEndValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); - animalton->setEasingCurve(QEasingCurve::OutBounce); - animalton->start(); - -} - -void MainWidget::zoom_up(QPushButton* btn) -{ - QScopedPointer animalton(new QPropertyAnimation(btn,"geometry")); - animalton->setDuration(150); - animalton->setStartValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); - animalton->setEndValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); - animalton->setEasingCurve(QEasingCurve::OutBounce); - animalton->start(); + if(TimerFlash != NULL) + { + qDebug() << "有信息到来显示窗体"; + disconnect(this,&MainWidget::new_message,effect, &QSoundEffect::play); + SystemTray->setIcon(QIcon(":/icon.png")); + delete TimerFlash; + TimerFlash = NULL; + } } void MainWidget::closeEvent(QCloseEvent *event) @@ -501,7 +573,8 @@ void MainWidget::closeEvent(QCloseEvent *event) { event->ignore(); this->hide(); - CreatSystemTray(); + connect(this,&MainWidget::new_message,this,&MainWidget::message_reminder); + connect(this,&MainWidget::new_message,effect, &QSoundEffect::play); break; } } diff --git a/mainwidget.h b/mainwidget.h index 82590cb..04b126a 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include #include @@ -42,6 +44,8 @@ signals: void exit_client(); void update_namelist(QString username); void account_cancellation(QString username); + void Minimized(); + void new_message(); private slots: void on_send_text_clicked(); @@ -50,28 +54,39 @@ private slots: void on_name_list_itemDoubleClicked(QListWidgetItem *item); void on_exit_btn_clicked(); void on_stop_clicked(); + void message_reminder(); + void onFlashTimerOut(); public slots: void update_text(QString sendname,QString data); void update_file(QString sendname,QString filename,QString file_data); void update_file_private(QString sendname,QString filename,QString file_data); void update_users(int count,QListonline_users); void disconnect_form_server(); + void slot_new_message(); private: Ui::MainWidget *ui; QString username; - QMenu* TrayMennu; //系统托盘右键菜单项 - QSystemTrayIcon* SystemTray; //系统托盘图标 + QPointer TrayMennu; //系统托盘右键菜单项 + QPointer SystemTray; //系统托盘图标 //右键菜单栏选项 - QAction* ActionShow; - QAction* ActionQuit; + QPointer ActionShow; + QPointer ActionQuit; + + QPointer TimerNotice; + QPointer TimerFlash = NULL; + uint flashCount; + + QPointer effect; void zoom_up(QPushButton* btn); void zoom_down(QPushButton* btn); - void CreatSystemTray(); + void CreateSystemTray(); + void showEvent(QShowEvent *event); void closeEvent(QCloseEvent *event); + void changeEvent(QEvent *event); }; #endif // MAINWIDGET_H