Qt Tutorial 8 - Preparing for
文件:
· tutorials/tutorial/t8/cannonfield.cpp
· tutorials/tutorial/t8/cannonfield.h
· tutorials/tutorial/t8/lcdrange.cpp
· tutorials/tutorial/t8/lcdrange.h
· tutorials/tutorial/t8/main.cpp
· tutorials/tutorial/t8/t8.pro
在这个例子中,我们介绍第一个可以自己画的自定义窗口部件。我们还加入了一个有用的键盘接口(仅用了两行代码)。
一行一行的品读
这个文件与第七章的lcdrange.h非常相似。我们添加了一个槽:setRange()。
void setRange(int minValue, int maxValue);
我们现在添加了设置LCDRange范围的可能性。直到现在,它被设置成了0到99。
这里构造函数有一个变化(我们会在后面进行讨论)。
void LCDRange::setRange(int minValue, int maxValue)
{
if (minValue < 0 || maxValue > 99 || minValue > maxValue) {
qWarning("LCDRange::setRange(%d, %d)/n"
"/tRange must be 0..99/n"
"/tand minValue must not be greater than maxValue",
minValue, maxValue);
return;
}
slider->setRange(minValue, maxValue);
}
setRange()槽设置了在LCDRange中的滑块的范围。因为我们已经把QLCDNumber设置为一直显示两位数字了,我们想通过限制范围值minVal和maxVal来避免QLCDNumber的溢出。(我们可以允许值低至-9但我们并没有选择这样做。)如果参数是非法的,我们使用qWarning()函数来向用户发出一个警告并立即返回。qWarning()是一个像printf的函数,默认发送它的输出到stderr。如果你想,你可以用qInstallMsgHandler()来安装你自己的处理函数。
CanonField是一个知道如何显示它自己的新自定义窗口部件。
CannonField 继承 QWidget. 我们使用了和LCDRange一样的方法.
int angle() const { return currentAngle; }
public slots:
void setAngle(int angle);
signals:
void angleChanged(int newAngle);
目前,CannonField只包含一个角度值,我们提供一个接口,这和在LCDRange中的值使用的是同样的方法。
protected:
void paintEvent(QPaintEvent *event);
这是我们在QWidget中遇到的众多事件处理器中的第二个。只要一个窗口部件需要刷新它自己(例如,画窗口部件的表面),这个虚函数就会被Qt调用。
又一次,我们试用和前一章的LCDRange同样的方法。
currentAngle = 45;
setPalette(QPalette(QColor(250, 250, 200)));
setAutoFillBackground(true);
}
构造函数初始化角度值为45度并为这个窗口部件设置了一个自定义调色板。
这个调色板用来表示背景颜色和选择其他合适的颜色。(对于这个窗口部件,实际上只有背景和文本的颜色将被用到。)然后我们调用setAutoFillBackground(true)来让Qt自动地填充背景。
QColor是一个形如RGB (red-green-blue) 三元组一样的指定值,每一个值介于0(暗)和255(亮)之间。我们也可以使用一个预定义的颜色如Qt::yellow来代替一个RGB指定值。
void CannonField::setAngle(int angle)
{
if (angle < 5)
angle = 5;