• 8800阅读
  • 7回复

[讨论]关于Qt C++ Examples: Traffic Light的一个疑问 [复制链接]

上一主题 下一主题
离线alexltr
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-09
在这个例子中,内部变量m_color的值一直是没有变的。但它的turnoff,turnon函数和painter.setBrush(m_color)是怎样改变LightWidget的颜色的呢?

#include <QtGui>

//! [0]
class LightWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(bool on READ isOn WRITE setOn)
public:
LightWidget(const QColor &color, QWidget *parent = 0)
: QWidget(parent), m_color(color), m_on(false) {}

bool isOn() const
{ return m_on; }
void setOn(bool on)
{
if (on == m_on)
return;
m_on = on;
update();
}

public slots:
void turnOff() { setOn(false); }
void turnOn() { setOn(true); }

protected:
virtual void paintEvent(QPaintEvent *)
{
if (!m_on)
return;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(m_color);
painter.drawEllipse(0, 0, width(), height());
}

private:
QColor m_color;
bool m_on;
};
[ 此帖被alexltr在2011-01-09 15:34重新编辑 ]
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线kimtaikee

只看该作者 1楼 发表于: 2011-01-09
人家是创建了三个不同颜色的lightwidget

离线alexltr

只看该作者 2楼 发表于: 2011-01-09
但是同一个light也有两种颜色,如红灯,turnon时是红色,但turnoff时是widget的背景色--黑色,这时painter.setBrush(m_color);中的m_color的值应是什么呢?
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线roywillow

只看该作者 3楼 发表于: 2011-01-09
很简单
如果不是on的,那么paintEvent直接返回,什么都不画,自然就是不亮的状态了吧
如果是on的,那就继续按照颜色绘制下去
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线alexltr

只看该作者 4楼 发表于: 2011-01-10
引用第3楼roywillow于2011-01-09 21:43发表的 :
很简单
如果不是on的,那么paintEvent直接返回,什么都不画,自然就是不亮的状态了吧
如果是on的,那就继续按照颜色绘制下去


如果当前是不亮的状态,要turnOn变为亮的状态,上面的解释就符合逻辑;
但如果当前是亮的状态,然后要turnOff变为不亮的状态,好像解释不通。
是我哪里理解错了吗?i am new on Qt.
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线dbzhang800

只看该作者 5楼 发表于: 2011-01-11
引用第4楼alexltr于2011-01-10 20:21发表的  :
如果当前是不亮的状态,要turnOn变为亮的状态,上面的解释就符合逻辑;
但如果当前是亮的状态,然后要turnOff变为不亮的状态,好像解释不通。
是我哪里理解错了吗?i am new on Qt.
.......

理解一点,paintEvent 会先清空原有的东西
离线roywillow

只看该作者 6楼 发表于: 2011-01-11
setOn(bool)中每次调用都会update,每次update都会把原来的清理掉然后重画
所以如果已经画了一次了,第二次画的时候还是要清理掉的应该,然后重新开始画
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线alexltr

只看该作者 7楼 发表于: 2011-01-11
Re:关于Qt C++ Examples: Traffic Light的一个疑问【已解决】
非常感谢各位耐心的答疑解惑!!!
是我对paintEvent和update不了解才会有这样的疑惑。

void QWidget::update () [slot]
Updates the widget unless updates are disabled or the widget is hidden.
This function does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does.
Calling update() several times normally results in just one paintEvent() call.
Qt normally erases the widget's area before the paintEvent() call. If the Qt::WA_OpaquePaintEvent widget attribute is set, the widget is responsible for painting all its pixels with an opaque color.
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
快速回复
限100 字节
 
上一个 下一个