怎么避免paintEvent()事件擦除以前绘制的图形?

如此美丽的你 2012-04-25 07:03:17
...全文
2925 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinjay 2012-04-27
  • 打赏
  • 举报
回复
pixmap有指定大小么?
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

http://www.kuqin.com/qtdocument/classes.html
去这个地址看sdk,都是中文的。
[/Quote]
怎么做了还是无法显示怎么办 !
编译时出现:QPainter::translate: Painter not active
dinjay 2012-04-27
  • 打赏
  • 举报
回复
http://www.kuqin.com/qtdocument/classes.html
去这个地址看sdk,都是中文的。
dinjay 2012-04-27
  • 打赏
  • 举报
回复 1
这个避免不了,一旦刷新就要都重绘,但是你可以这样做:
就像你说的,
//我在widget类中定义了:
QPixmap pixmap;

//用在timeEvent()中:
pixmap.fill(this,0,0);
repaint();//这里换成update();

//在paintEvent()中:
QPainter(this);
painter.drawPixmap(0,0,pixmap);
这样就行了,你可以看下sdk
void update ()
void update ( int x, int y, int w, int h )
void update ( const QRect & r )
update有3个重载,根据需要使用。

void QWidget::update ( const QRect & r ) [槽]

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
更新窗口部件中的矩形r,除非更新已经失效或者窗口部件被隐藏。

这个函数不会导致一个立刻的重新绘制——更正确的是,当Qt回到主事件回路中时,它规划了所要处理的绘制事件。这样允许Qt来优化得到比调用repaint()更快的速度和更少的闪烁。

几次调用update()的结果通常仅仅是一次paintEvent()调用。
里拉克丝_tiny 2012-04-27
  • 打赏
  • 举报
回复
载paintEvent里面作判断就行了
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
还是闪一下就消失了,我了个去太打击新手了。
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

我是建了个新工程,然后在main中屏蔽掉MainWindow这个的show,copy你的widget类,在main里
MyWidget dlg;
dlg.show();

这样就是我说的效果。
[/Quote]

我把全部的代码贴出来给我看看吧!
mywidget.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
void timerEvent(QTimerEvent *);
private:
bool start;
QPixmap pixmap;
};
#endif // MAINWINDOW_H


mywidget.cpp

#include<QMainWindow>
#include<QPainter>
#include "mainwindow.h"
MyWidget::MyWidget(QWidget *parent):QWidget(parent),pixmap(800,600)
{
start=true;
resize(800,600);
startTimer(50000);

}

void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
QRect rect(0,0,800,600);
QBrush brush(QColor(200,20,10));
painter.setBrush(brush);
if(start==true)
{

painter.drawRect(rect);
pixmap.fill(this,0,0); //保存第一次画的东西
start=false;
}
else
{
painter.drawPixmap(0,0,pixmap);//还原
}
}
void MyWidget::timerEvent(QTimerEvent *)
{
pixmap.fill(this,0,0);
update();
}



main.cpp


#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}

没有啥的昵称 2012-04-27
  • 打赏
  • 举报
回复
我在你的init()处加了画线的函数,开始能出现,过了定时时间后就消失,说明起作用了。
没有啥的昵称 2012-04-27
  • 打赏
  • 举报
回复
我这里窗口不是黑色的,一直都是Qt默认的,winXP下。

[Quote=引用 32 楼 的回复:]
我是建了个新工程,然后在main中屏蔽掉MainWindow这个的show,copy你的widget类,在main里
MyWidget dlg;
dlg.show();

这样就是我说的效果。
[/Quote]
dinjay 2012-04-27
  • 打赏
  • 举报
回复
我是建了个新工程,然后在main中屏蔽掉MainWindow这个的show,copy你的widget类,在main里
MyWidget dlg;
dlg.show();

这样就是我说的效果。
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
我了个去,怪了,怪了。
dinjay 2012-04-27
  • 打赏
  • 举报
回复
void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
if(start==true)
{

init();
pixmap.fill(this,0,0); //保存第一次画的东西
start=false;
}
else
{
painter.drawPixmap(0,0,pixmap);//还原
}

}
这个代码,在我这里是没问题的,一上来窗口背景都是黑色的,然后timer一到就还原成默认的窗口颜色了。
dinjay 2012-04-27
  • 打赏
  • 举报
回复
void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
if(start==true)
{

init();
pixmap.fill(this,0,0); //保存第一次画的东西
start=false;
}
else
{
painter.drawPixmap(0,0,pixmap);//还原
}

}
这个代码,在我这里是没问题的,一上来窗口背景都是黑色的,然后timer一到就还原成默认的窗口颜色了。

如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

是啊,第一次是进入到start==true这个条件里了,你在里面绘制东西是会显示的,但是,等下一次再进入到paintEvent时,这时候start==false,也就是paintEvent里你什么都没画,没画东西当然什么都不会显示出来了啊,你以为第一次的还会在上面?????
[/Quote]
但第一次画的东西应该维持20秒啊,我设置了startTimer(20000)的麻,为什还是闪一下就消失了。

还有这种情况也是闪一下就消失了。

void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
if(start==true)
{

init();
pixmap.fill(this,0,0); //保存第一次画的东西
start=false;
}
else
{
painter.drawPixmap(0,0,pixmap);//还原
}

}

dinjay 2012-04-27
  • 打赏
  • 举报
回复
是啊,第一次是进入到start==true这个条件里了,你在里面绘制东西是会显示的,但是,等下一次再进入到paintEvent时,这时候start==false,也就是paintEvent里你什么都没画,没画东西当然什么都不会显示出来了啊,你以为第一次的还会在上面?????
dinjay 2012-04-27
  • 打赏
  • 举报
回复
我把你的代码copy过来试了,运行就一个窗口,没有任何绘制的。
paintEvent只执行一次,timer到时了再进入到paintEvent时就相当什么都没干了。
不知道你说的闪一下就消失是只什么?
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
程序启动是不是先调用构造Widget()---->paintEvent()--->再调用timeEvent()---->等待事件发生,做出相应的响应。
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

你想实现什么功能啊?
paintEvent里你什么都没画啊,start是true,所以一上来就进入pixmap.fill(this,0,0);
fill不是绘制,painter.drawPixmap才是~
[/Quote]

void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
if(start==true)
{

//draw something //这里我调用了一个函数init(),在init()里面是画了图的
pixmap.fill(this,0,0);
start=false;
}
// else
// {
// painter.drawPixmap(0,0,pixmap);
// }

}
如此美丽的你 2012-04-27
  • 打赏
  • 举报
回复
完全搞不懂了!

MyWidget::MyWidget(QWidget *parent):QWidget(parent),pixmap(800,600)
{
start=true;
resize(800,600);
startTimer(20000);
}
void MyWidget::paintEvent(QPaintEvent *paintevent)
{
QPainter painter(this);
if(start==true)
{

//draw something
pixmap.fill(this,0,0);
start=false;
}
// else
// {
// painter.drawPixmap(0,0,pixmap);
// }

}
void MyWidget::timerEvent(QTimerEvent *timerevent)
{
// pixmap.fill(this,0,0);
update();
}

按理说最初的画面应该维持20后才刷新啊,怎么还是闪一下就消失了。
dinjay 2012-04-27
  • 打赏
  • 举报
回复
你想实现什么功能啊?
paintEvent里你什么都没画啊,start是true,所以一上来就进入pixmap.fill(this,0,0);
fill不是绘制,painter.drawPixmap才是~
加载更多回复(15)

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧