QWidget中執行update()後paintEvent()不執行

nshiwoya 2009-12-10 07:17:14

.h
class WidgetLc:public QWidget
{
Q_OBJECT
public:
WidgetLc(QWidget * parent=0,Qt::WFlags f=0);
void setFocusRout(QString fr);
protected:
void paintEvent(QPaintEvent *event);
private:
QString FocusRout;
};
.cpp
void WidgetLc::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter *painter=new QPainter(this);
........
QPainterPath myPath;
myPath.addText(myPointF, myFont,FocusRout);
painter->drawPath(myPath);
}
void WidgetLc::setFocusRout(QString fr)
{
FocusRout=fr;
update();
}
//在初始化時setFocusRout(QString fr)正常執行,能夠畫出文字,但在外部調用時paintEvent()沒有執行

希望各位幫小弟看看.謝謝!!!
...全文
716 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oswin 2010-05-17
  • 打赏
  • 举报
回复
我也遇到这个问题了,请问你这里解决了吗?我的邮箱是peizhyi@gmail.com,希望您能把解决方法告诉我,感激不尽。。
benbenmajia 2009-12-11
  • 打赏
  • 举报
回复
你可以显式的来做一下试试效果,比如设置一个返回值,在paint动作中刷新,我以前做的时候是这样做的
nshiwoya 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dext 的回复:]
你 connect 了 你的 btnClicked 了没有?

[/Quote]
謝謝,有connect,調試的時候在

void WidgetLc::setFocusRout(QString fr)
{
FocusRout=fr;
//這裏FocusRout都可以取到新的值,
update();//只是執行update()後paintEvent()事件不執行.
}
nshiwoya 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhihaining 的回复:]
C/C++ code
MainWin::MainWin( QWidget* parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
wid_lc=new WidgetLc(gb_lc);
wid_lc->setFocusRout("123456789");//這裏能夠正常 ......
}
怎么没看见你用setupUi(this);?

可以试试repaint(),代替update。因为update被优化了。另外setUpdatesEnabled(true);要打开。

[/Quote]
謝謝你的解答,我在

WidgetLc::WidgetLc(QWidget * parent, Qt::WFlags f):QWidget(parent, f)
{
setUpdatesEnabled(true);//在這加了也不可以,另外,用過repaint()也是一樣
....
}
RamonJin 2009-12-11
  • 打赏
  • 举报
回复
update不是立刻重绘,等qt回到主事件循环后才重绘。它会把临近的update merge到一起。repaint是立即重绘。
可能调用多次update,才调用一次paintEvent。repaint是立即调用paintEvent。
qt建议无论何时都用update取代repaint。
dext 2009-12-11
  • 打赏
  • 举报
回复
你 connect 了 你的 btnClicked 了没有?
zhihaining 2009-12-11
  • 打赏
  • 举报
回复

MainWin::MainWin( QWidget * parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
wid_lc=new WidgetLc(gb_lc);
wid_lc->setFocusRout("123456789");//這裏能夠正常
......
}

怎么没看见你用setupUi(this);?

可以试试repaint(),代替update。因为update被优化了。另外setUpdatesEnabled(true);要打开。
rzsheng 2009-12-11
  • 打赏
  • 举报
回复
用repaint试试看
nshiwoya 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dext 的回复:]
Paint 事件 是一个 比较特殊的事件,加断点不是好方法,但是 你可以 输出 qDebug 信息啊?
来判断 paint 是否 执行。
[/Quote]
你好,我加過了,就是沒有執行.
dext 2009-12-11
  • 打赏
  • 举报
回复
Paint 事件 是一个 比较特殊的事件,加断点不是好方法,但是 你可以 输出 qDebug 信息啊?
来判断 paint 是否 执行。
nshiwoya 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 benbenmajia 的回复:]
你可以显式的来做一下试试效果,比如设置一个返回值,在paint动作中刷新,我以前做的时候是这样做的
[/Quote]
你好,可以描述詳細點嗎?我是新手,不是很明白所說意思.
nshiwoya 2009-12-10
  • 打赏
  • 举报
回复
調用的代碼為

class MainWin : public QMainWindow, public Ui::Main_Dlg
{
Q_OBJECT
public:
MainWin( QWidget * parent = 0, Qt::WFlags f = 0 );
~MainWin();
private:
QWidget *centerm;
WidgetLc *wid_lc;
void btnClicked();
};
.cpp
MainWin::MainWin( QWidget * parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
wid_lc=new WidgetLc(gb_lc);
wid_lc->setFocusRout("123456789");//這裏能夠正常
......
}
void MainWin::btnClicked()
{
wid_lc->setFocusRout("abcdefg");//這裏執行後就不會顯示,請各位幫忙看一下,謝謝.
}

16,212

社区成员

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

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