• 7072阅读
  • 18回复

[提问].实现中this->repaint();//事件,这个函数讲讲在代码中作用 [复制链接]

上一主题 下一主题
离线r187111
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-10
  1. #ifndef YAO_H
  2. #define YAO_H
  3. #include <QDialog>
  4. #include <QLabel>
  5. #include <QPushButton>
  6. #include <QPaintEvent>
  7. #include <QTimerEvent>
  8. class Yao:public QDialog{
  9. Q_OBJECT
  10. private:
  11. QLabel* luckPeople;
  12. QLabel* luckName;
  13. QPushButton * start;
  14. QPushButton *stop;
  15. bool state;
  16. QString names[50];
  17. int num;
  18. QImage image;
  19. public:
  20. Yao();
  21. ~Yao();
  22. protected :
  23. void paintEvent(QPaintEvent *);
  24. void timerEvent(QTimerEvent * event);
  25. public slots:
  26. void change();
  27. };
  28. #endif // YAO_H

---------------------------------------------

  1. #include "yao.h"
  2. #include <QImage>
  3. #include <QPainter>
  4. Yao::Yao(){
  5. luckPeople=new QLabel("luckPeople:",this);
  6. luckPeople->move(50,10);
  7. luckPeople->resize(50,20);
  8. luckName=new QLabel(this);
  9. luckName->resize(50,20);
  10. luckName->move(150,10);
  11. start=new QPushButton("start",this);
  12. stop=new QPushButton("stop",this);
  13. start->move(30,600);
  14. stop->move(320,600);
  15. luckPeople->show();
  16. luckName->show();
  17. start->show();
  18. stop->show();
  19. //启动定时器
  20. this->startTimer(200);
  21. state=false;
  22. //把名字和图片对应
  23. for(int i=0;i<6;i++){
  24. names[i]="test"+
  25. QString::number(i+1);
  26. }
  27. connect(start,SIGNAL(clicked()),this,SLOT(change()));
  28. connect(stop,SIGNAL(clicked()),this,SLOT(change()));
  29. this->resize(500,650);
  30. }
  31. Yao::~Yao(){
  32. delete luckPeople;
  33. delete luckName;
  34. delete start;
  35. delete stop;
  36. }
  37. void Yao::paintEvent(QPaintEvent *e){
  38. //随机加載图片
  39. QString str=":/images/";
  40. num=qrand()%5+1;
  41. str+=QString::number(num);
  42. str+=".jpg";
  43. QPainter qp(this);
  44. if(state){
  45. image.load(str);
  46. luckName->setText(names[num-1]);
  47. QPoint point(30,30);
  48. qp.drawImage(90,30,image,0,0,320,480);
  49. }else{
  50. qp.drawImage(90,30,image,0,0,320,480);
  51. }
  52. }
  53. void Yao::timerEvent(QTimerEvent * event){
  54. //让窗口重新绘制
  55. qDebug("%d",qrand()%10);
  56. this->repaint();//事件,这个函数什么意思?
  57. }
  58. void Yao::change(){
  59. if(((QPushButton*)
  60. sender())->text()=="start"){
  61. state=true;
  62. }else{
  63. state=false;
  64. }
  65. }

------------------------
  1. #include "yao.h"
  2. #include <QApplication>
  3. int main(int argc,char **argv){
  4. QApplication app(argc,argv);
  5. Yao yao;
  6. yao.show();
  7. return app.exec();
  8. }



离线jdwx

只看该作者 1楼 发表于: 2012-02-10
回 楼主(r187111) 的帖子
update();
在消息队列里添加一个重绘事件,如果很频繁可以被合并执行。
repaint();
立即重绘。
最后都是调用paintEvent();
要是widget不可见,两个函数什么都不做。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线r187111
只看该作者 2楼 发表于: 2012-02-11
回 1楼(jdwx) 的帖子
哥哥,update();函数//在程序里没有吧?

void Yao::timerEvent(QTimerEvent * event)
{
  qDebug("%d",qrand()%10);
    this->repaint();//老师说:调用这个函数是用于与下面的函数联系起来的,对吗?
}

void Yao::change()
{
    if(((QPushButton*) sender())->text()=="start")
         state=true;
   else
         state=false;  

离线r187111
只看该作者 3楼 发表于: 2012-02-13
回 1楼(jdwx) 的帖子
void Yao::timerEvent(QTimerEvent * event){  
//让窗口重新绘制  
qDebug("%d",qrand()%10);  
this->repaint();

} //这俩函数 之间有联系吗?

void Yao::change(){  
if(((QPushButton*)  
sender())->text()=="start"){  
state=true;  
}else{  
state=false;  
}  
}
离线jdwx

只看该作者 4楼 发表于: 2012-02-13
看不出void Yao::change() 和  repaint();之间有什么关系。
而且void Yao::change()写的有问题,不够严谨。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线r187111
只看该作者 5楼 发表于: 2012-02-16
回 4楼(jdwx) 的帖子
QT中QWidget类什么作用?
void Yao::change()写的有问题,不够严谨//怎么改?
离线dxfans

只看该作者 6楼 发表于: 2012-02-16
repaint函数就是让窗口重绘,导致paintEvent函数立即被调用;
你这段代码的意思就是定时重绘窗口
离线dxfans

只看该作者 7楼 发表于: 2012-02-16
回 2楼(r187111) 的帖子
一楼回答的很清楚了。。update和repaint都行,只是方式不同;
repaint和change函数没联系
离线dxfans

只看该作者 8楼 发表于: 2012-02-16
回 5楼(r187111) 的帖子
建议在change函数里不要通过信号发送者的文本信息判断来修改state的值;
你在连接信号槽时,独自触发各自的槽函数即可;
例如:
connect(start,SIGNAL(clicked()),this,SLOT(changestart()));
connect(stop,SIGNAL(clicked()),this,SLOT(changestop()));
然后在分别实现changestart和changestop函数即可,逻辑和change函数一样;
void Yao::changestart()
{
         state=true;
}

void Yao::changestop()
{
         state=false;  
}


离线r187111
只看该作者 9楼 发表于: 2012-02-21
回 4楼(jdwx) 的帖子
void Yao::change()大哥 为啥不够严谨?
update();在消息队列里添加一个重绘事件,如果很频繁可以被合并执行。//很频繁是指的什么?

要是widget不可见,两个函数什么都不做。//widget不可见是什么意思?
离线r187111
只看该作者 10楼 发表于: 2012-02-21
回 8楼(dxfans) 的帖子
void Yao::change()大哥 为啥不够严谨?
update();在消息队列里添加一个重绘事件,如果很频繁可以被合并执行。//很频繁是指的什么?

要是widget不可见,两个函数什么都不做。//widget不可见是什么意思?
离线jdwx

只看该作者 11楼 发表于: 2012-02-22
回 9楼(r187111) 的帖子
update()很频繁是指,消息队列里有多个没有被处理的update()事件。

不严谨:(QPushButton*) sender())->text()=="start")
QObject * QObject::sender () const
sender()返回QObject*类型,被强制转换成QPushButton*,
使用QPushButton的text()函数,一个程序里的QObject子类不可能都是QPushbutton
还有可能是其它的类,不一定有text()函数,应该先检测sender()是不是QPushButton。

不可见就是在屏幕上看不到,有可能被隐藏了,有可能被其他窗口挡住了。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dxfans

只看该作者 12楼 发表于: 2012-02-24
回 11楼(jdwx) 的帖子
不严谨是指不要通过按钮的文本来进行条件判断,违背了设计模式中的开放封闭原则,即对修改是封闭的,而对扩展是开放的;
离线dxfans

只看该作者 13楼 发表于: 2012-02-24
回 11楼(jdwx) 的帖子
假如哪天开发人员只修改了这个按钮的文本,还要在槽函数中修改【(QPushButton*) sender())->text()=="start")】代码。。。这不很郁闷嘛
离线r187111
只看该作者 14楼 发表于: 2012-02-24
回 11楼(jdwx) 的帖子
严谨应该怎么写?
离线r187111
只看该作者 15楼 发表于: 2012-02-24
回 11楼(jdwx) 的帖子
大哥 助我
离线jdwx

只看该作者 16楼 发表于: 2012-02-25
咱们写的是程序,不是库,不用考虑那么多的问题。
但是数据还是要检查的,不要使用未经过验证的数据(变量)。
这个是最基本的。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线r187111
只看该作者 17楼 发表于: 2012-02-28
回 13楼(dxfans) 的帖子
用这个,对吧?

connect(start,SIGNAL(clicked()),this,SLOT(changestart()));
connect(stop,SIGNAL(clicked()),this,SLOT(changestop()));
然后在分别实现changestart和changestop函数即可,逻辑和change函数一样;
void Yao::changestart()
{
         state=true;
}

void Yao::changestop()
{
         state=false;  
}
离线dxfans

只看该作者 18楼 发表于: 2012-02-28
回 17楼(r187111) 的帖子
OK.............
快速回复
限100 字节
 
上一个 下一个