找回密码
 立即注册
收起左侧

关于托盘图标的显示问题

6
回复
9258
查看
[复制链接]
累计签到:4 天
连续签到:1 天
来源: 2013-10-10 15:50:56 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 judas1987 于 2013-10-10 15:56 编辑

这个是我在网上找到的一个代码,修修改改以后可以运行,但是唯一的问题就是托盘图标和程序图标显示不出来。
还有这个地方quitAct=new QAction(QString::fromUtf8("关闭"),this);,写成“退出”系统就报错……

下面贴出代码
  1. #include"alarm.h"
  2. #include<QtGui>

  3. Alarm::Alarm(QWidget * parent)
  4.     :QDialog(parent)
  5. {
  6.     init();
  7.     layout();
  8.     con();
  9. };

  10. //  ******
  11. //  初始化
  12. //  ******

  13. void Alarm::init()
  14. {
  15.     setWindowTitle("闹钟");        //设置标题
  16.     setFixedSize(QSize(320,80));        //固定大小

  17.     timer=new QTimer;                //控制lcd的时间刷新
  18.     uptimer=new QTimer;                //控制对话框上升
  19.     dtimer=new QTimer;                //控制对话框下降
  20.     itimer=new QTimer;

  21.     lcdNumber=new QLCDNumber;                                                //显示当前时间
  22.     lcdNumber->setFixedSize(QSize(150,50));                        //固定大小
  23.     lcdNumber->setDigitCount(8);                                                //显示八个数字,默认是显示5个数字
  24.     lcdNumber->setSegmentStyle(QLCDNumber::Flat);        //填充颜色,默认是白色的
  25.     lcdNumber->display(QTime::currentTime().toString("hh:mm:ss"));        //设置格式,还有其他形式的


  26.     label=new QLabel(QString::fromUtf8("闹钟设置"));        //提示设置下个闹钟
  27.     //使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,主要应用于处理汉语显示乱码等问题
  28.     //实验发现还是乱码,只有fromUtf8()函数可以实现汉字的正常显示
  29.     timeEdit=new QTimeEdit;                                                                //设置下个闹钟
  30.     timeEdit->setDisplayFormat("hh:mm:ss");

  31.     button=new QPushButton(QString::fromUtf8("确定"));

  32.     if (!QSystemTrayIcon::isSystemTrayAvailable())      //判断系统是否支持系统托盘图标
  33.        {
  34.            return;
  35.        }

  36.     trayIcon=new QSystemTrayIcon(this);                                                //托盘icon
  37.     trayIcon->setIcon(QIcon(":/ico.ico"));   //设置图标图片,有问题,验证
  38.     //trayIcon->show();
  39.     setWindowIcon(QIcon(":/png.png"));    //设置窗口图片

  40.     trayIcon->setToolTip("闹钟 V1.0");
  41.     //设置鼠标放在图标上的提示信息
  42.     trayIcon->show();

  43.     restoreAct=new QAction(QString::fromUtf8("显示"),this);
  44.     quitAct=new QAction(QString::fromUtf8("关闭"),this);
  45.     //不知道为什么,这里如果写成“退出”会报错,说常量中有换行符,改成其他的就没有问题

  46.     trayIconMenu=new QMenu;
  47.     trayIconMenu->addAction(restoreAct);
  48.     trayIconMenu->addAction(quitAct);

  49.     trayIcon->setContextMenu(trayIconMenu);  //设置托盘上下文菜单,右键菜单

  50.     setWindowFlags(Qt::WindowStaysOnTopHint);
  51. };

  52. //  ****
  53. //  布局
  54. //  ****

  55. void Alarm::layout()
  56. {
  57.     QHBoxLayout * rightTopLay=new QHBoxLayout;//设置右边上方的layout,自左向右为label和timeEdit
  58.     rightTopLay->addWidget(label);
  59.     rightTopLay->addWidget(timeEdit);

  60.     QHBoxLayout * rightButtomLay=new QHBoxLayout;//
  61.     rightButtomLay->addStretch();   //有个弹簧顶着
  62.     rightButtomLay->addWidget(button);

  63.     QVBoxLayout * rightLay=new QVBoxLayout;//垂直布局,从上往下
  64.     rightLay->addLayout(rightTopLay);
  65.     rightLay->addLayout(rightButtomLay);
  66.     rightLay->addStretch();

  67.     QHBoxLayout * main=new QHBoxLayout;//主布局,左右布局
  68.     main->addWidget(lcdNumber);
  69.     main->addLayout(rightLay);
  70.     setLayout(main);

  71.     rect=QApplication::desktop()->rect();//
  72.     x=rect.right()-width();//left()则是从左起,往右为加;right()是从右起,往左为减
  73.     y=rect.bottom()+20;//从下自上,设置缓慢上升时的初始y位置
  74.     //控制弹窗的初始位置
  75.     setGeometry(x,y,width(),height());
  76.     //从屏幕上(x,y)位置开始(即为最左上角的点),显示一个width()*height()的界面
  77. };

  78. //  ****************
  79. //  connect 信号与槽
  80. //  ****************

  81. //Qt4的语法?
  82. void Alarm::con()
  83. {
  84.     connect(timer,SIGNAL(timeout()),this,SLOT(clockChange()));
  85.     timer->start(1000);
  86.     //当timer到期,发出信号给clockChange接收,即更新LCD显示的时间,间隔为1000毫秒(一秒)
  87.     //timeout()->This signal is emitted when the timer times out.

  88.     connect(uptimer,SIGNAL(timeout()),this,SLOT(dialogUp()));
  89.     uptimer->start(20);
  90.     //对话框上升

  91.     connect(dtimer,SIGNAL(timeout()),this,SLOT(down()));
  92.     dtimer->start(20);
  93.     //对话框下降

  94.     connect(button,SIGNAL(clicked()),dtimer,SIGNAL(timeout()));
  95.     connect(button,SIGNAL(clicked()),this,SLOT(mini()));
  96.     //当button被点击时,对话框下降,并且最小化到托盘

  97.     connect(itimer,SIGNAL(timeout()),this,SLOT(comToCur()));
  98.     itimer->start(20);

  99.     connect(restoreAct,SIGNAL(triggered(bool)),uptimer,SIGNAL(timeout()));
  100.     connect(this,SIGNAL(isCurrentTime()),uptimer,SIGNAL(timeout()));
  101.     //两个SIGNAL,指的是信号关联

  102.     connect(itimer,SIGNAL(timeout()),this,SLOT(comToCur()));
  103.     itimer->start(10);
  104.     //itimer是一个判断,判断设定时间和真实时间差的。
  105.     //itimer到期,发出信号给comToCur()接收。
  106.     //comToCur()说明,当真实时间和设定时间一致时,执行函数,发送信号给isCurrentTime()
  107.     //isCurrentTime()信号和uptimer()信号相关联,传递给uptimer(),执行对话框的上升

  108.     connect(quitAct,SIGNAL(triggered(bool)),this,SLOT(close()));
  109.     //退出
  110. };

  111. //  **************
  112. //  显示变化的时间
  113. //  **************
  114. //  和信号槽联合起来,每秒刷新一次,重置lcdNumber,实现时钟动起来
  115. void Alarm::clockChange()
  116. {
  117.     lcdNumber->display(QTime::currentTime().toString("hh:mm:ss"));
  118. };


  119. //  **************************
  120. //  闹钟到了,提示框慢慢升起来
  121. //  **************************
  122. void Alarm::dialogUp()
  123. {
  124.     show();
  125.     uptimer->start(20);
  126.     if(y>=rect.bottom()-height()-50)
  127.     {
  128.         y-=10;//设置升起的速度
  129.     }
  130.     else
  131.     {
  132.         uptimer->stop();//全部升起则停止
  133.     }
  134.     setGeometry(x,y,width(),height());
  135. };


  136. //  *************************
  137. //  确定后,下降,然后隐藏起来
  138. //  *************************
  139. void Alarm::down()
  140. {
  141.     dtimer->start(20);
  142.     if(y<rect.bottom())
  143.     {
  144.         y+=height()+20;//下降的深度
  145.     }
  146.     else
  147.     {
  148.         dtimer->stop();
  149.     }
  150.     setGeometry(x,y,width(),height());
  151. };


  152. //  ************
  153. //  最小化到托盘
  154. //  ************
  155. void Alarm::mini()
  156. {
  157.     hide();

  158. };


  159. //  ***********
  160. //  close Event
  161. //  ***********
  162. void Alarm::closeEvent(QCloseEvent *event)
  163. {
  164.     QMessageBox::information(0,"Quit","Are you sure exit the Alarm?");
  165. };


  166. //  ****************************
  167. //  对比现在时间,与所设置的时间
  168. //  ****************************
  169. void Alarm::comToCur()
  170. {
  171.     if( QVariant(QTime::currentTime()).toString() == QVariant(timeEdit->time()).toString() )
  172.     {
  173.         QApplication::beep();
  174.         emit isCurrentTime();
  175.     }
  176. };
复制代码
我的图标路径是D:\Qt\learn\alarm,也创建了images文件夹,在qrc中也能显示这两个图片……实在不知道了……请教各位

最佳答案

查看完整内容

qrc的路径?qrc好像加入工程就好,路径不打紧的。主要应该是qrc里面的前缀和文件名(我比较喜欢设置别名),例如你新建前缀:/image,加入图片start.png,然后设置别名start,程序里面就写":/image/start"就好。label载入图片,我比较喜欢放在本目录,这个百度qt qlabel显示图片之类,网上会有很多教程的。

相关帖子

回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2013-10-10 15:50:57 显示全部楼层
qrc的路径?qrc好像加入工程就好,路径不打紧的。主要应该是qrc里面的前缀和文件名(我比较喜欢设置别名),例如你新建前缀:/image,加入图片start.png,然后设置别名start,程序里面就写":/image/start"就好。label载入图片,我比较喜欢放在本目录,这个百度qt qlabel显示图片之类,网上会有很多教程的。
回复

使用道具 举报

尚未签到

2013-10-11 14:39:18 显示全部楼层
一般图片显示不出来不是路径有问题就是单独运行没有附带插件,可以先弄个label之类的控件试着显示这张图片。

至于你改文字也能出错。。。我也不懂了
回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-10-11 15:14:22 显示全部楼层
文字出错不是这一个程序……网上也查了很多,好像是字库的原因……还是直接tr()国际化吧……
回复

使用道具 举报

累计签到:87 天
连续签到:1 天
2013-10-12 08:52:00 显示全部楼层
用相对路径试试,弄到resource里面
回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-10-14 10:01:47 显示全部楼层
20030969 发表于 2013-10-12 08:52
用相对路径试试,弄到resource里面

我就是用的qrc……我总是怀疑qrc的路径问题……为什么网上那么多人说的路径都是不一样的……有的说是“:/……”有的说的是“/……”有的是“://……”。。。我都混乱了
回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-10-24 15:40:34 显示全部楼层
camelback5 发表于 2013-10-15 10:58
qrc的路径?qrc好像加入工程就好,路径不打紧的。主要应该是qrc里面的前缀和文件名(我比较喜欢设置别名) ...

谢谢……后来又测试了其他的程序,写成那样子就没有问题……我再去用你的方法试试吧……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了