首页 > 其他分享 >Qt托盘消息通知(③托盘消息列表)

Qt托盘消息通知(③托盘消息列表)

时间:2024-11-25 12:55:47浏览次数:8  
标签:Qt trayIcon 列表 托盘 消息 include QTimer view

实现思路

  1. 创建消息窗口:使用 QWidget 或 QDialog 来创建一个显示消息的窗口。
  2. 使用 QListWidget:在消息窗口中使用 QListWidget 来动态显示消息。
  3. 添加滑块:如果消息数量超过5条,使用 QScrollArea 来实现滑动功能。
  4. 更新消息列表:每次接收到新的消息时更新消息列表。

完整代码示例

以下是如何在之前的托盘图标基础上实现消息列表功能的完整代码:

main.cpp

#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QWidget>
#include <QTimer>
#include <QIcon>
#include <QCursor>
#include <QListView>
#include <QAbstractListModel>
#include <QVBoxLayout>
#include <QScrollBar>

class MessageModel : public QAbstractListModel {

public:
    MessageModel(QObject *parent = nullptr) : QAbstractListModel(parent) {}

    void addMessage(const QString &message) {
        beginInsertRows(QModelIndex(), rowCount(), rowCount());
        messages.append(message);
        endInsertRows();
    }

    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        Q_UNUSED(parent);
        return messages.size();
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {
        if (!index.isValid() || index.row() < 0 || index.row() >= messages.size())
            return QVariant();
        if (role == Qt::DisplayRole) {
            return messages.at(index.row());
        }
        return QVariant();
    }

private:
    QStringList messages;
};

class TrayApp : public QWidget {

public:
    TrayApp() {
        trayIcon = new QSystemTrayIcon(QIcon(":/Image/QQ图标.png"), this);
        trayIcon->setToolTip("消息托盘");

        // 创建菜单
        QMenu *menu = new QMenu();
        QAction *exitAction = menu->addAction("退出");
        connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
        trayIcon->setContextMenu(menu);
        trayIcon->show();

        // 消息模型
        model = new MessageModel(this);
        view = new QListView();
        view->setModel(model);
        view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // 显示滚动条
        view->setFrameShape(QFrame::NoFrame); // 去掉边框

        // 安装事件过滤器以监测鼠标进入和离开事件
        view->installEventFilter(this);

        // 定时器,模拟新消息
        messageTimer = new QTimer(this);
        connect(messageTimer, &QTimer::timeout, this, &TrayApp::simulateNewMessage);
        messageTimer->start(5000); // 每5秒模拟一次新消息

        // 闪烁定时器
        flashTimer = new QTimer(this);
        connect(flashTimer, &QTimer::timeout, this, &TrayApp::toggleIcon);

        // 定时器检测鼠标位置
        mousePositionTimer = new QTimer(this);
        connect(mousePositionTimer, &QTimer::timeout, this, &TrayApp::checkMousePosition);
        mousePositionTimer->start(100); // 每100毫秒检查一次鼠标位置
    }

protected:
    bool eventFilter(QObject *obj, QEvent *event) override {
        if (obj == view) {
            if (event->type() == QEvent::Enter) {
                view->show(); // 鼠标进入列表时显示
            } else if (event->type() == QEvent::Leave) {
                view->hide(); // 鼠标离开列表时隐藏
            }
        }
        return QWidget::eventFilter(obj, event);
    }

private slots:
    void simulateNewMessage() {
        QString sender = "用户" + QString::number(model->rowCount() + 1);
        model->addMessage(sender); // 添加新消息
        trayIcon->showMessage("新消息", "您有一条新消息!", QSystemTrayIcon::Information);

        // 启动闪烁定时器
        flashTimer->start(500); // 每500毫秒切换一次图标
    }

    void toggleIcon() {
        static bool isFlashing = false;
        if (isFlashing) {
            trayIcon->setIcon(QIcon(":/Image/QQ图标.png")); // 正常图标
        } else {
            trayIcon->setIcon(QIcon(":/Image/QQ图标-未登录.png")); // 闪烁图标
        }
        isFlashing = !isFlashing;
    }

    void checkMousePosition() {
        QPoint cursorPos = QCursor::pos(); // 获取鼠标位置
        QRect trayRect = trayIcon->geometry(); // 获取托盘图标的几何形状
        if (trayRect.contains(cursorPos)) {
            // 计算列表的高度
            int itemHeight = view->sizeHintForRow(0); // 获取每个列表项的高度
            int height = qMin(model->rowCount() * itemHeight, 5 * itemHeight); // 最大高度为5条消息的高度

            view->setFixedHeight(height); // 设置列表固定高度
            view->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); // 设置窗口样式
            view->move(trayRect.x(), trayRect.y() - height); // 显示在托盘上方
            view->show();
        } else {
            if (!view->underMouse()) {
                view->hide(); // 隐藏消息列表
            }
        }
    }

private:
    QSystemTrayIcon *trayIcon;
    QTimer *flashTimer;
    QTimer *messageTimer;
    QTimer *mousePositionTimer;
    MessageModel *model;
    QListView *view;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    app.setQuitOnLastWindowClosed(false);

    TrayApp trayApp; // 创建托盘应用实例
    return app.exec();
}

代码说明

  1. 消息窗口
    • MessageWindow 继承自 QWidget,用来显示消息。
    • 使用 QListWidget 来显示消息内容,并限制其高度,使其能够在超出5条后

代码效果展示

 

标签:Qt,trayIcon,列表,托盘,消息,include,QTimer,view
From: https://www.cnblogs.com/wang1299/p/18567341

相关文章

  • Qt托盘消息通知(①托盘图标)
    创建托盘图标工程的思路步骤创建Qt项目:首先,您需要创建一个新的QtWidgets应用程序项目。添加必要的Qt模块:在项目文件(.pro)中添加对 QtWidgets 和 QtGui 模块的支持。创建主窗口类:我们将创建一个主窗口类来处理托盘图标的创建和管理。设置托盘图标:使用 QSystemTrayIcon ......
  • Qt托盘消息通知(②托盘消息通知)
    实现思路准备消息内容:我们需要定义通知的标题和内容。调用 showMessage 方法:使用 showMessage 方法在托盘区域显示通知。设置通知图标:可以选择不同的图标来表示不同类型的消息(信息、警告、错误等)。完整代码示例在之前的托盘图标工程基础上,我们将添加消息通知的功能。m......
  • 基于bootstrap4封装的消息对话框组件
    在线预览  下载 这是一款基于bootstrap4封装的消息对话框组件。该消息组件包括dialog,alert,confirm,input,success,error,notice。并且对话框支持鼠标或手指触摸拖拽。 使用方法在页面中引入下面的文件。lt;linkrel="stylesheet"href="bootstrap-4.0.0-dist......
  • QT6 Clion
    cmake_minimum_required(VERSION3.29)project(untitled2)set(CMAKE_CXX_STANDARD17)set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_AUTOUICON)set(CMAKE_PREFIX_PATH"C:/Qt/6.8.0/mingw_64/lib/cmake")find_package(Qt6COMPONENTSCoreGui......
  • Qt 打包为可执行文件(详解)
    https://blog.csdn.net/dfr110719/article/details/136992619<divid="content_views"class="htmledit_views"><pid="main-toc"><strong>目录</strong></p>一.打包为文件夹二.打包为可执行......
  • Qt实现系统托盘消息
    实现思路创建主应用程序:使用 QApplication 作为应用程序的基础。创建系统托盘图标:使用 QSystemTrayIcon 来显示图标在系统托盘中。添加右键菜单:为托盘图标添加右键菜单,允许用户选择退出应用程序。显示新消息:使用 QTimer 定期触发显示消息,模拟新消息到达的情况。处理槽......
  • Qt实现全局快捷键
    实现思路使用WindowsAPI在Qt应用程序中注册全局快捷键,使得用户无论在何种情况下都能通过特定的键组合来控制某些功能(例如音乐播放控制)。通过响应消息机制与系统托盘图标结合,提供用户友好的交互界面。实现步骤1.创建Qt应用程序使用QtCreator创建一个新的QtWidget......
  • Qt关于窗口一直调用paintEvent的踩坑实录
    首先看以下代码:voidItemBlockWidget::paintEvent(QPaintEvent*ev){//先调用父类的paintEvent以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOptionopt;opt.initFrom(this);QPainterp(this);s......
  • KTL 一个支持C++14写公式的K线工具 - 0.9.2版,通达信mdt全景数据复盘大盘,Qt自定义图表
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL    国内仓库:https://gitee.com/bbqz007/KTL 当前0.9.2新添加功能基于QCharts跟通达信mdt数据文件。使用者能够使用QCharts自定义数据处理图表。......
  • bootstrap4和jQuery消息通知插件
    在线预览  下载 这是一款基于bootstrap4的jQuery消息通知插件。该消息通知插件使用简单,可生成多种主题的toast消息通知,可设置为自动消失或固定时间消失等,非常实用。  使用方法在页面中引入jquery和bootstrap4相关文件,以及notifyMessage相关文件。<linkhref=......