#include <QApplication>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QSlider>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
window->setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox;
QSlider *slider = new QSlider(Qt::Horizontal);
spinBox->setRange(0, 130);
slider->setRange(0, 130);
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
spinBox->setValue(35);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);
window->show();
return app.exec();
}
QApplication是一个负责GUI程序的控制流程和主要设置的类,对于任何UI程序来说,有且只能有一个QApplication对象;当然对于没有UI的Qt程序来说,应该使用QCoreApplication。因为只有一个QApplication,为了方便访问这个类的唯一对象,定义了一个宏qApp,源码中这样定义的
static_cast<QApplication *>(QCoreApplication::instance())
Qt是事件驱动的,QApplication通过sendEvent()和postEvent()来把所有接受到的事件分发给目标窗口
QWidget 是所有用户交互窗口对象的基类,它从窗口系统中接受鼠标,键盘和其他事件,并且重绘自己。可以通过选择合适的 window flag来创建不同类型的window(a widiget that is not emedded in a parent widget is called a window)。
QWidget提供了很多成员函数,但是这其中有很多函数没有实际功能(虚函数),这些函数的具体功能是由继承类具体实现的。
在Qt中,对于Widget对象分为两类,一是Top-Level Widget(window), 另外一类是Non-Window(Child),它们是根据是否有父窗口来决定的(例外,如果即使有窗口,如果显示设置window flag的话也可以变为window)
QObject是所有Qt对象的基类,也是整个Qt框架的核心。Qt的核心机制就是一种成为“信号与槽”的对象间的通讯。QObject以树的形式组织自己以及和自己相关的对象,我们可以通过名称来查找对象。
对于信号与槽机制,这篇文章给了较完整的叙述http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/
上面那篇文章里没有提到Auto Connection相关的事情:Qt的元对象系统提供了一种自动匹配QObject子类之间信号和槽的自动connect.
void QMetaObject::connectSlotsByName ( QObject * object ) [static]
该函数会递归的搜索传入对象object的所有子对象,并对按照下列规则定义的信号和槽进行自动连接 void on_<object name>_<signal name>(<signal parameters>);
假设我们有个对象拥有一个子控件button1, 对于button1的clicked()的信号,on_button1_clicked()槽会被自动connect
void on_button1_clicked();
关于什么是元对象以及moc:http://www.thisisqt.com/forum/viewthread.php?tid=48