一.常见的父窗口有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.对应的语法要求:总结一下即是信号的参数一般都要和槽函数的参数保持一致。
点击按钮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();
创建滑块(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();
}