动态更改图标[QT / c ++]

时间:2012-03-22 13:29:51

标签: c++ qt dynamic icons

我想在Qt中实现动态变化的效果托盘图标。 但是我似乎无法在谷歌上找到任何相关链接,所以你有任何想法如何做到这一点?

如果你不知道我要求的是什么,我已经创建了一个gif文件,你会明白我的想法。

所以任何链接,代码,示例都表示赞赏。 http://gifninja.com/animatedgifs/715636/icon.gif

修改

所以我想出了一些代码,但它没有用,你能不能看看它?

mainwindow.h

QPixmap test;
QSystemTrayIcon *speedPerformance;

mainwindow.cpp

然后在mainwindow构造函数中我有:

this->test = QPixmap(16,16);

然后我称之为这段代码:

QTimer *trayIconTimer = new QTimer(this);
connect(trayIconTimer , SIGNAL(timeout()), this, SLOT(updateSpeedIcon()));
trayIconTimer->start(2000); // update it every 2 seconds

然后我创建了trayicon

speedPerformance = new QSystemTrayIcon(this);
QPainter p(&test);
QColor color;
p.fillRect(0,0,16,16,color.black());
p.end();
speedPerformance->setIcon(QIcon(test));

最后,这里是updateSpeeIcon()的代码,每2秒调用一次:

QPainter p(&test);
QColor color;
p.setPen(color.red());
xPaint+=3;
qDebug() << xPaint;
p.fillRect(xPaint,0,2,16,color.red());
p.end();
speedPerformance->setIcon(QIcon(test));

所以,除了当我尝试通过点击安装的其他trayicon退出程序时这段代码给我分段错误这一事实,得到的托盘图标是16x16黑色方块,并且从来没有那些红色填充矩形我我试图画画,你知道什么是错的吗?

3 个答案:

答案 0 :(得分:4)

可能的解决方案是使用QTimer。您必须将timeout信号连接到您将更新图标的插槽。

QTimer *trayIconTimer = new QTimer(this);
connect(trayIconTimer , SIGNAL(timeout()), this, SLOT(updateTrayIcon()));
timer->start(2000); // update it every 2 seconds

在插槽中,您将创建新图标并进行设置:

voi updateTrayIcon()
{
     QIcon newIcon = CreateIcon();
     // I assume that tray is a pointer to the `QSystemTrayIcon` 
     tray->setIcon(newIcon);
}

答案 1 :(得分:1)

由于您有托盘图标,因此您必须已使用QSystemTrayIcon课程。使用此课程,您可以随时更改托盘图标。只需致电QSystemTrayIcon::setIcon()

答案 2 :(得分:0)

如果我理解你的问题,这些是你应该遵循的步骤;

inside your application class,
    create a icon variable
    create a dataSource variable

    inside constructor()
        icon = DEFAULT_ICON
        connect(dataSource, SIGNAL(performanceChanged()), 
                 this, SLOT(updateIcon()));

    inside updateIcon()
        var = dataSource.getPerformanceLevel();
        switch(var)
            case LEVEL_1:
                icon = getLevel1Icon()
            case LEVEL_2:
                icon = getLevel2Icon()
            ....

希望这会有所帮助...