这个例子显示了创建几个窗口部件并用信号和槽把它们连接起来,和如何处理重新定义大小事件。
#include <QApplication>
#include <Qpushbutton>
#include <QVBoxLayout>
#include <QLCDNumber>
#include <QSlider>
#include <Qfont>
class MyWidget :public QWidget
{
public:
MyWidget(QWidget* parent=0, Qt::WindowFlags name = Qt::WindowFlags());
};
MyWidget::MyWidget(QWidget* parent, Qt::WindowFlags name)
:QWidget(parent, name)
{
QPushButton *quit = new QPushButton("Quit", this);
quit->setFont(QFont("Times", 18, QFont::Bold));
connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
QLCDNumber *lcd = new QLCDNumber(2, this);
QSlider *slider = new QSlider(Qt::Orientation::Horizontal, this);
slider->setRange(0, 99);
slider->setValue(0);
connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
//(练习)LCD数字溢出的时候应用程序退出
//connect(lcd, SIGNAL(overflow()), qApp, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(quit);
layout->addWidget(lcd);
layout->addWidget(slider);
setLayout(layout);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
一行一行地解说
#include <QVBoxLayout>
#include <QLCDNumber>
#include <QSlider>
这里显示的是三个新的被包含的头文件。QSlider
和QLCDNumber
在这里是因为我们使用了两个新的窗口部件。QVBoxLayout
在这里是因为我们使用了Qt的自动布局支持。
class MyWidget :public QWidget
{
public:
MyWidget(QWidget* parent=0, Qt::WindowFlags name = Qt::WindowFlags());
};
MyWidget::MyWidget(QWidget* parent, Qt::WindowFlags name)
:QWidget(parent, name)
{
MyWidget
继承了QWidget
,里面只有一个构造函数。
QLCDNumber *lcd = new QLCDNumber(2, this);
lcd
是一个QLCDNumber
,一个可以按像LCD的方式显示数字的窗口部件。这个实例被设置为显示2个数字,并且是this的子窗口部件。
QSlider *slider = new QSlider(Qt::Orientation::Horizontal, this);
slider->setRange(0, 99);
slider->setValue(0);
QSlider
是一个经典的滑块,用户可以通过在拖动一个东西在一定范围内调节一个整数数值的方式来使用这个窗口部件。这里我们创建了一个水平的滑块,设置它的范围是0~99(包括0和99,参见QSlider::setRange()
文档)并且它的初始值是0。
connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
这里我们是用了信号/槽机制把滑块的valueChanged()
信号和LCD数字的display()槽连接起来了。
无论什么时候滑块的值发生了变化,它都会通过发射valueChanged()
信号来广播这个新的值。因为这个信号已经和LCD数字的display()槽连接起来了,当信号被广播的时候,这个槽就被调用了。这两个对象中的任何一个都不知道对方。这就是组件编程的本质。
槽是和普通C++成员函数的方式不同,但有着普通C++成员函数的方位规则。
行为
LCD数字反应了你对滑块做的一切,并且这个窗口部件很好地处理了重新定义大小事件。注意当窗口被重新定义大小(因为它可以)的时候, LCD数字窗口部件也改变了大小,但是其它的还是和原来一样(因为如果它们变化了,看起来好像很傻)。
练习
试着改变LCD数字,添加更多的数字或者改变模式。你甚至可以添加四个按钮来设置基数。
你也可以改变滑块的范围。
也许使用QSpinBox
比滑块更好?
试着当LCD数字溢出的时候使这个应用程序退出。
现在你可以进行 第六章 了。
其他:
#include <QApplication>
#include <Qpushbutton>
#include <QVBoxLayout>
#include <QLCDNumber>
#include <QSlider>
#include <Qfont>
int main(int argc, char **argv)
{
QApplication a(argc, argv);
QWidget window;
QPushButton *quit = new QPushButton("Quit", &window);
quit->setFont(QFont("Times", 18, QFont::Bold));
QObject::connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
QLCDNumber *lcd = new QLCDNumber(2, &window);
QSlider * slider = new QSlider(Qt::Horizontal, &window);
slider->setRange(0, 99);
slider->setValue(0);
QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
QVBoxLayout layout;
layout.addWidget(quit);
layout.addWidget(lcd);
layout.addWidget(slider);
window.setLayout(&layout);
window.show();
return a.exec();
}