QT编程之信号和槽机制知识

qt知识总结

一.常见的父窗口有3类:

1.QWidget:它是所有对象的基类-继承自QOject和OPaintDevice

2.QMainWindow:它提供了一个主要的应用窗口,可以用来构建APP的应用界面。

3.QDialog:对话框

其中QMainWindow和QDialog是QWidget的子类。

使用父窗口的好处:可以使得创建的控件停靠在某个父窗口的上面,这时控件将位于父窗口的内部,随着父窗口一起移动,隐藏显示,否则将作为独立窗口显示在屏幕上,一个控件占据一个窗口。

父窗口

1.父窗口的析构函数返回的时候会自动销毁子窗口对象,如果子窗口对象是通过new操作符创建的,可以不显示的执行delete操作,不会造成内存泄漏的现象。

如下代码所示:

int main(int argc, char *argv[])
{
    //创建QT应用程序对象
    QApplication app(argc, argv);
//    QWidget parent;
//    QMainWindow parent;
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
//    labe标签停靠在父窗口上
    QLabel label("i am label",&parent);
    label.move(30,30);
//    button标签停靠在父窗口上
    QPushButton button("i am button",&parent);
    button.move(30,100);
    button.resize(100,50);
//    堆区创建的对象,这里指定了父窗口的指针,所以可以不需要显示的delete,避免内存泄漏。
    QPushButton* button1 =new QPushButton("我是按钮",&parent);
    button1->resize(100,50);
    button1->move(200,100);
//    父窗口显示的时候,上面停靠的窗口也将会显示
    parent.show();
//    这句话不能写,写了之后就看不到button1按钮了,它会释放资源,由于事件循环没有退出。当事件循环退出的时候,由于app是栈区开辟的,它在释放自身
//    空间的同时,父窗口对象销毁的时候,对应的对象会被自动销毁。
//     delete button1;
//  让应用程序进入事件循环,等待窗口的关闭
    return app.exec();
}

信号和槽机制(最重要的机制)

信号和槽机制:是两个对象之间建立通信方式的一种机制。

当一个控件发生改变的时候,它会发出某个信号(比如鼠标点击按钮,拖动滑动条等),另一个对象收到该信号之后,就会触发对应的槽函数(slot),(类似于linux中进程接收到信号之后会触发对应的信号处理函数)从而该对象会作出相对应的处理。

信号和槽机制主要是通过connect函数完成的定义,具体定义如下:注意,该函数是静态函数。

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

第一个参数是发送者的地址,第二个参数是字符串指针(代表相对应的信号),第三个参数是接受对象的地址,第四个对象是对应的槽函数方法。第五个参数是连接类型,默认是自动连接,具备默认参数值,不需要用户指定。

注意点

1.对应的signal和method必须通过SIGNAL和SLOT宏将对应的函数进行转换为字符型常量指针。

2.给定的signal和method函数的参数只包括类型,不要给定参数名称。下面的方式是错误的,加了value值。

 // wrong!
 QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                  label, SLOT(setNum(int value)));

3.对应的语法要求:总结一下即是信号的参数一般都要和槽函数的参数保持一致。
QT编程之信号和槽机制知识_第1张图片

4.对应的信号和槽的连接的应用
QT编程之信号和槽机制知识_第2张图片

demo1:

点击按钮1删除标签,点击按钮2退出程序。一旦用户点击按钮之后,QPushButton对象即会发送click信号给Qlabel对象,Qlabel对象接受到信号之后,就会触发自己的槽函数,从而关闭掉对应的标签。

  //创建QT应用程序对象
    QApplication app(argc, argv);
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
    QLabel label("i am label",&parent);
    label.move(30,30);
    QPushButton button("i am button",&parent);
    button.move(30,100);
    button.resize(100,50);
    //点击按钮关闭标签
    QObject::connect(&button,SIGNAL(clicked()),&label,SLOT(close()));
    //点击按钮退出应用程序
    QPushButton button2("退出应用程序",&parent);
    button2.move(150,100);
    button2.resize(100,50);
//    QObject::connect(&button2,SIGNAL(clicked()),&app,SLOT(closeAllWindows()));
    QObject::connect(&button2,SIGNAL(clicked()),&parent,SLOT(close()));
    parent.show();
    return app.exec();

demo2

创建滑块(QSlider)和选址框(QSpinBox),使得两者可以同步发生改变。

int main(int argc, char *argv[])
{
    //创建QT应用程序对象
    QApplication app(argc, argv);
    QDialog parent;
    parent.move(100,100);
    parent.resize(320,320);
    QSlider slider(Qt::Horizontal,&parent);
    slider.move(20,100);
    QSpinBox spinbox(&parent);
    spinbox.move(120,100);
    slider.setRange(0,200);
    spinbox.setRange(0,200);
    //关键代码就是这两句,当滑块进行滑动的时候,对应的值会发生改变,因此会发送信号,此时spinbox会重新设定选框的数值。
    QObject::connect(&slider,SIGNAL(valueChanged(int)),&spinbox,SLOT(setValue(int)));
    // 同理当选框的数值发生改变之后,也会发生信号,从而滑块当前的数值会被重新设定。
    QObject::connect(&spinbox,SIGNAL(valueChanged(int)),&slider,SLOT(setValue(int)));
    parent.show();
    return app.exec();
}

你可能感兴趣的:(QT编程,qt,c++)