QT—按钮的相关接口,对象树
按钮位于QPushButton类中,而QPushButton 继承于 QAbstractButton 继承于QWidget 继承于QObject
构造函数
auto b = new QPushButton;无参构造
auto b1 = new QPushButton(文本,父亲);带参构造
(按钮的构造函数还有3种,就不在这里一一列举,有需要的话,大家可以在帮助手册里面看)
接口
resize 重置大小
setFixedSize 设置固定大小
move 设置位置
setParent 设置父亲
setFont 设置字体
show 显示窗口函数
(这里只给出常用的几种,其他的大家可以在帮助手册里面看)
案例说明(创建一个“start”按钮,并设置其一系列属性)
main.cpp文件(创建项目自动产生的,无需修改,看懂即可)
#include "Widget.h" //空窗口
#include <QApplication> //应用程序头文件
//程序入口
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //定义应用程序对象
Widget w; //定义空窗口对象
w.show(); //调用空窗口子函数,显示窗口
return a.exec(); //调用应用程序对象的消息循环函数,如果注释掉这条语句,窗口则会随着main函数的运行结束而退出(闪退)
}
Widget.h文件(创建项目自动产生的,信号和槽下节课讲到)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget> //包含Qt空窗口
class Widget : public QWidget
{
Q_OBJECT //宏,支持信号和槽
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
Widget.cpp(程序的整个界面都在这个文件里面完成)
#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Start"); //设置窗口标题
//this->resize(400,500); //设置窗口大小(宽,高),可拖拽
this->setFixedSize(200,200); //设置窗口固定大小,不可拖拽,即无法改变窗口
QPushButton* btn = new QPushButton;
btn->resize(100,70);//按钮大小
btn->setParent(this);//设置父亲,让按钮处于框中
//设置字体创建字体对象(字体,大小,加粗,倾斜)
QFont font("楷体",20,10,1);
btn->setFont(font);
//按钮位置
btn->move(100,100);
btn->show();//显示按钮
//这里仅作了解。
//设置按钮的颜色和悬浮(hover)的按钮颜色,鼠标按下(pressed)
btn->setStyleSheet("QPushButton{background-color: red; }\
QPushButton:hover{background-color: green;}\
QPushButton:pressed{background-color:yellow;}");
}
Widget::~Widget()
{
}
运行结果
对象树
在上面的案例中,我们注意到用了new关键字创建了button对象,但是没有释放,这是为什么?
——引出了QT中的一个重要元素—对象树。
当创建的对象在堆区时,如果指定的父亲是 QObject 派生下来的或者 Qobject 子类派生下来的类。可以不用增加其释放的操作。该对象会放入到对象树中,由 QT 自己管理共释放。
对象树一定程度上简化了内存回收机制。
-
Qobject是以对象树的形式组织起来的:当创建QT对象时,需要为其为其设置一个父对象,那么这个对象就会自动添加到其父对象中。当父对象析构时,这个列表中的所有对象也会被析构。
-
Qwidget是能够在屏幕上显示的窗口父类。Qwidget继 承自Qobject,因此也继承了对象树关系。添加QWidget为父亲的组件会自动添加到列表中自动析构。
-
构造时自上而下,释放时自下而上,构造父亲再构造派生类(与C++继承的构造与析构一样)。释放派生类再释放父类。 (析构时先看有没有孩子有孩子则去析构孩子以此类推找到最下层孩子进行释放)