• 6219阅读
  • 2回复

[讨论]提示反馈控件怎么实现 [复制链接]

上一主题 下一主题
离线sno_guo
 
只看楼主 倒序阅读 楼主  发表于: 2012-10-11
大家好,我想实现这样的一个效果: 一个小方块,等点击某个操作后,在屏幕的右下角显示一个反馈信息,等一秒后消失.有点类似android手机里的提示控件toast,其中一个大问题就是:这个QWidget怎么自动的删除自己所占用的内存空间。


我的代码思路是这样的: 继承一个QWidget,再里面放一个定时器,等时间到后,关闭当前这个Widget,并自动的回收这个对象的内存,这样做放到别的类中构造函数还可以,可是放到普通函数中,就出现段错误,请问下这个是什么情况.
我的代码如下




  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QWidget>
  5. #include <QtGui/QWidget>
  6. #include <QTimer>
  7. #include <QGroupBox>
  8. #include <QLabel>
  9. class CToast : public QWidget
  10. {
  11.     Q_OBJECT
  12. public:
  13.     explicit CToast(const int timeMs=10000,const QString string="set success!",QWidget *parent = 0);
  14.     ~CToast();
  15. private slots:
  16.     void closewidget();
  17. private:
  18.     QLabel *label;
  19.     QGroupBox *grpWidget;
  20.     QTimer *timer;
  21. };
  22. #include <QTimer>
  23. class Widget : public QWidget
  24. {
  25.     Q_OBJECT
  26.     
  27. public:
  28.     Widget(QWidget *parent = 0);
  29.     ~Widget();
  30. private slots:
  31.     void timerouttest();
  32. private:
  33.     QTimer *m_timer;
  34. };
  35. #endif // WIDGET_H
  36. C/C++ code
  37. #include "widget.h"
  38. #include <QHBoxLayout>
  39. #include <QLabel>
  40. #include <QDesktopWidget>
  41. #include <QApplication>
  42. #include <QMessageBox>
  43. #include <QTimer>
  44. #include <QGridLayout>
  45. #include <QGraphicsColorizeEffect>
  46. CToast::CToast(const int timeMs, const QString string, QWidget *parent)
  47.       : QWidget(parent)
  48. {
  49.     setWindowFlags(Qt::FramelessWindowHint);  //设置无windows标题
  50.     setFixedSize(80,40);
  51.     move(200,150);  
  52.     timer=new QTimer;
  53.     connect(timer,SIGNAL(timeout()),this,SLOT(closewidget()));
  54.     timer->start(timeMs);
  55.     setStyleSheet("background-color: black;border-radius:15px");
  56.     label=new QLabel((string));
  57.     label->setStyleSheet("color:white");
  58.      QGridLayout *rowWin=new QGridLayout;
  59.      rowWin->setContentsMargins(5,5,5,5);
  60.      rowWin->addWidget(label,0,0);
  61.      setLayout(rowWin);
  62. }
  63. CToast::~CToast()
  64. {
  65.      delete label;
  66.      delete grpWidget;
  67.      delete timer;
  68.      timer=NULL;
  69. }
  70. void CToast::closewidget()
  71. {
  72.     timer->stop();
  73.     close();
  74.    delete this;
  75. }
  76. Widget::Widget(QWidget *parent)
  77.     : QWidget(parent)
  78. {
  79.     m_timer=new QTimer();
  80.      connect(m_timer,SIGNAL(timeout()),this,SLOT(timerouttest()));
  81.      m_timer->start(1000);
  82. }
  83. Widget::~Widget()
  84. {
  85.     
  86. }
  87. void Widget::timerouttest()
  88. {
  89.   CToast *to1=new CToast(1000*1,"lajdsajs");
  90. }


离线XChinux

只看该作者 1楼 发表于: 2012-10-12
代码太啰嗦了,比如就用QLabel吧,用的时候

QLabel *label = new QLabel("xxxx", this);
label->show();
QTimer::singleShot(3000, label, SLOT(deleteLater()));

或者
QLabel *label = new QLabel("xxxx", this);
label->setAttribute(Qt::WA_DeleteOnClose, true);
label->show();
QTimer::singleShot(3000, label, SLOT(close()));
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线sno_guo
只看该作者 2楼 发表于: 2012-10-22
谢谢,谢谢,XChinux ,佩服您啊,这个论坛一定要经常过来,Qt原来这么有好,呵呵
快速回复
限100 字节
 
上一个 下一个