请教QT中界面的显示闪烁的消除问题

oyxdl07 2005-04-28 03:07:23
小弟刚刚学QT,做了一个界面,中间有一部分是字符串显示的,用是QScrollView累,大概显示200行记录,只是要一秒钟刷新一次(增加一条),结果在刷新的时候会出现闪烁问题,代码如下,请高手指点一下,有没有可一消除闪烁的方法,好象mfc中有

void MyCustomWidget::drawContents(QPainter* p, int cx, int cy, int cw, int ch)
{
// The Background
if ( !bg.isNull() )
{
int rowheight=bg.height();
int toprow=cy/rowheight;
int bottomrow=(cy+ch+rowheight-1)/rowheight;
int colwidth=bg.width();
int leftcol=cx/colwidth;
int rightcol=(cx+cw+colwidth-1)/colwidth;
for (int r=toprow; r<=bottomrow; r++)
{
int py=r*rowheight;
for (int c=leftcol; c<=rightcol; c++)
{
int px=c*colwidth;
p->drawPixmap(px, py, bg);
}
}
return;
}
else
{
p->fillRect(cx, cy, cw, ch, QColor(255,255,255));
}
{
QFontMetrics fm=p->fontMetrics();
p->setPen(red);
int rowheight=fm.lineSpacing();
int toprow=cy/rowheight;
int bottomrow=(cy+ch+rowheight-1)/rowheight;
int colwidth=fm.width("00000,000000 ")+3;
int leftcol=cx/colwidth;
int rightcol=(cx+cw+colwidth-1)/colwidth;
QString str;
for (int r=toprow; r<=bottomrow; r++) {

if(r >= 200)
break;
int py=r*rowheight;
int px=0;
if(start == NULL)
break;
p->drawText(0, py+fm.ascent(), start[r]);
}
}



}
...全文
1344 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
smiledcf 2005-04-29
  • 打赏
  • 举报
回复
使用双缓冲或者使用QCanvas和QCanvasView
其中QCanvas内部实现了双缓冲,而且做了优化
qfxx 2005-04-29
  • 打赏
  • 举报
回复
见http://www.yourblog.org/Sort/20041/1158_1.html

首先,要想把闪烁减弱,请设置组件的背景模式为NoBackground.
setBackgroundMode(NoBackground);

其次,重载组件的paintEvent()函数,如下改写:
void MyWidget::paintEvent(QPaintEvent *e)
{
QRect ur=e->rect();//得到组件尺寸
QPixmap pix(ur.size());//以此为参数创建一个位图变量
pix.fill(this,ur.topLeft());//填充位图
QPainter p(&pic);//以位图为参数创建一个QPainter 对象

p.translate(-ur.x(),-ur.y());//在QPainter 上绘画
//......//Drawing

p.End();//绘画完毕

bitBlt(this,ur.topLeft().&pix);//把位图贴到组件上
}
oyxdl07 2005-04-29
  • 打赏
  • 举报
回复
双缓冲是怎样实现的,能说明一下吗?
或者给个例子看看好吗?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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