您的位置:首页 > 编程语言 > Qt开发

[QT起航] 第二篇——(一)初识Qt(第一个Qt程序、信号与槽、布局)

2016-10-03 23:26 477 查看
一、第一个QT程序

#include <QtWidgets/QApplication>  // 包含 QApplication 类所需的头文件
#include <QtWidgets/QLabel>        // 包含控件Label所需的头文件

int main(int argc, char *argv[])   // C++ mian 函数标准写法
{
QApplication a(argc, argv);// 创建Qt应用
QLabel *label = new QLabel("Hello Qt!"); // 创建标签,设定文字内容
label->show();             // 显示标签
return a.exec();           // 进入消息循环,等待可能的事件,并进行响应
}


在一个完整的QT程序中,QApplication a(argc, argv);和a.exec();是必不可少的。

二、信号与响应函数

1.以下例子用来说明怎么响应信号,当按钮被点击时退出程序。

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);                          //创建APP
QPushButton *button = new QPushButton("Quit");         //设置按钮名称
QObject::connect(button, SIGNAL(clicked()),            //将按钮和应用绑定,当点击按钮时触发点击事件,应用退出
&app, SLOT(quit()));
button->show();                                        //显示按钮
return app.exec();                                     //进入事件循环
}


// 信号和槽
// 语法
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
// SIGNAL 和 SLOT 实际是将函数转换为字符串,在 connect 的时候进行检查,如果检查失败则connect失败
// 一个信号可以对应多个槽,但是槽的调用顺序是随机的

// 一个槽可以接受多个信号

// 信号也可以连接信号,当前一个信号发出后,后一个信号也跟着发送

// connect 连接可以删除。此函数使用比较少,当一个对象删除后,Qt自动删除这个对象的所有连接
disconnect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));

// 信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接..如果信号参数多于槽,则多于的会被忽略。如果参速类型不匹配,或者信号和槽不存在,debug时会有提示。

// 信号和槽不仅适用于控件,其实信号和槽机制,在QObject中就已经实现。可以实现在任何从 QObject 继承的子类中。


2.以下代码演示如何在窗口中排列多个控件。学习使用信号和槽使控件同步。该程序将一个spinbox和slider通过信号和槽连接起来,当一方的值变化时,另一方的值进行同步。

程序中使用了三个控件: QSpinBox, QSlider 和 QWidget。 QWidget 是这个程序的主窗口。 QSpinBox 和 QSlider 被放在 QWidget 中;他们是 QWidget 的 children。反过来,我们也可以称 QWidget 是 QSpinBox 和 QSlider 的 parent。 QWidget 没有 parent,因为它是程序的顶层窗口。在 QWidget 及其子类的构造函数中,都有一个 QWidget*参数,用来指定它们的父控件。

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QSlider>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
window->setWindowTitle("Enter your age");//创建主窗口,并设置其标题

QSpinBox *spinbox = new QSpinBox;        // 创建spinbox控件,设置其范围
QSlider  *slider = new QSlider;          // 创建slider控件,设置其范围
spinbox->setRange(0, 130);
slider->setRange(0, 130);

// 关联 spinbox 和 slider
QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

spinbox->setValue(25);                   // 设置spinbox 的默认值,此时spinbox触发valueChanged信号

//将vaule = 25传递给setValue,slider的值得到同步。此时slider也会触发valueChanged信号,但由于spinbox值
//本来就为25,所以spinbox不会发送任何信号,不会导致死循环

QHBoxLayout *layout = new QHBoxLayout;   // 创建一个水平布局管理器
layout->addWidget(spinbox);              // 将 spinbox 加入 layout 的管理队列
layout->addWidget(slider);               // 将 slider  加入 layout 的管理队列

window->setLayout(layout);

// 将水平布局管理器放到主窗口中,设置spinbox 和 slider 的父窗口为window,即布局管理器所在的控件
//如果一个控件由布局管理器确定它的大小和位置,那个创建它的时候就不必指定一个明确的“父”控件。

window->show();                          // 显示窗口
return app.exec();
}

// 三种布局管理器
// QHBoxLayout:水平排列控件。
// QVBoxLayout:垂直排列控件。
// QGridLayout:按矩阵方式排列控件


// QSpinBox 简述
// public常用成员函数
explicit QSpinBox(QWidget *parent = Q_NULLPTR);// QSpinBox的构造函数,参数代表其父窗口。
void setPrefix(const QString &prefix);         // 设置前缀
void setSuffix(const QString &suffix);         // 设置后缀
void setSingleStep(int val);                   // 设置步长
void setRange(int min, int max);               // 设置范围

// protected
bool event(QEvent *event);
virtual QValidator::State validate(QString &input, int &pos) const;
virtual int valueFromText(const QString &text) const;
virtual QString textFromValue(int val) const;
virtual void fixup(QString &str) const;

// 信号函数
void valueChanged(int);                     //
void valueChanged(const QString &);         //

// 槽函数
void setValue(int val);                     //
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt