新手从零开始学Qt编程(2)

第三步:信号槽和布局管理器:

例:

#include 
#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget *window = new QWidget;
    window->setWindowTitle("Enter your age");

    QSpinBox *spinBox = new QSpinBox;
    QSpinBox *spinBox2 = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal); //滑动条
    QSlider *slider2 = new QSlider(Qt::Horizontal); //滑动条
    spinBox->setRange(0, 150);
    slider->setRange(0, 150);
    slider2->setRange(0, 150);
    spinBox2->setRange(0, 150);
    //题目1..
    QObject::connect(slider2, SIGNAL(valueChanged(int)), spinBox2, SLOT(setValue(int)));
    //QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));//信号槽在传送信号的时候,会把函数的数值也传送给槽用
    QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
    QObject::connect(spinBox2, SIGNAL(valueChanged(int)), slider2, SLOT(setValue(int)));
    spinBox->setValue(35);//数值的初始化
    //题目2..
    QVBoxLayout *mainlayout = new QVBoxLayout;
    QHBoxLayout *layout = new QHBoxLayout; //水平布局的一个布局管理器
    QHBoxLayout *layout2 = new QHBoxLayout;
    layout->addWidget(slider);      //放置slider到布局管理器
    layout->addWidget(spinBox);     //放置spinbox到布局管理器
    layout2->addWidget(slider2);
    layout2->addWidget(spinBox2);
    mainlayout->addLayout(layout);
    mainlayout->addLayout(layout2);
    window->setLayout(mainlayout);      //放置布局管理器
    window->show();                 //显示布局管理器上面的所有内容
    return app.exec();
}

信号槽:

QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));

例中,拿slider来说,如上面使用connect函数时,将slider中的valueChanged(int)信号注册。slider中的值有所变化,即valueChanged(int)有反应时,

spinbox会收到这个变化信号,变化函数的数值也会同时传给spinbox,spinbox会做出相应变化,以此达到信号槽目的。

QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

同时注册此函数,spinbox中数值有变化时,也会有信号发给sliderslider会有相应变化。

—————两函数同时使用时,因为是采用数值变化量来当作信号,无论slider和spinbox哪个发生变化,都会给对方发出信号,是否会有无限死循环效应呢?

————其实是不会的,比如slider发生变化时,spinbox也发生变化,值与原本变化的值相同,spinbox虽然发生变化,会发出信号,但是因为注册的信号是alueChanged(int)即参数变化量,他会把slider中的数值与spinbox对比,发现两值相等了,他就会被停在那个地方,从而等待下一次变化信号了。

布局管理器(上篇):

也可以叫画板,这个的话,一共有三种布局方法,一种水平布局,一种垂直布局,一种网格布局。

(1)水平布局:顾名思义,就是添加的按钮、文本框、拖动条等等东西,都是水平分布。

(2)垂直布局:参考水平布局,只是他是垂直布局的。

(3)网格布局:这个稍微特殊点,就是你把窗口想象成网格状,然后通过坐标来添加你的组件。(这个等会儿细说)

三种布局可以嵌套使用,使用方法例中有一个,可以自己看,挺好理解的,不过有一点必须声明,最后用setLayout()函数时,只能有一个。

水平布局的话,用的类名是:QHBoxLayout

具体用法:

QHBoxLayout *layout = new QHBoxLayout;

layout->addWidget(slider);      //放置slider到布局管理器

layout->addWidget(spinBox);     //放置spinbox到布局管理器

mainlayout->addLayout(layout);  //将layout添加到mainyout中

window->setLayout(mainlayout);      //放置布局管理器 

此例中,window中,只能设置一个布局管理器,所以可以讲要的添加到mainyout中。

程序运行结果:

新手从零开始学Qt编程(2)_第1张图片

你可能感兴趣的:(QT编程,新手从零开始学Qt编程(2))