Qt Programing With C++ (2nd) 之 age

来源:互联网 发布:coreldraw mac 编辑:程序博客网 时间:2024/06/08 15:42
#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