coding
unsky
deepdim
thought

QT5从入门到放弃:(2)基础窗口部件

QT提供默认的几类只有QMainWindow,QWidget,QDialog三种,这三种窗体是最常见的,QMainWindow带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的几类,而他们全部继承自QWidget.

他们之间详细的关系如下:

窗口和部件以及窗口类型

窗口部件是QT中建立用户元素的主要部件,其中作为部件附属于其他窗口的可以简称为部件,而没有上级的成为窗口(根)
看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<QApplication>
#include<QDialog>
#include<QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDialog *w1=new QDialog();
w1->setWindowTitle("thie is win1");
QLabel * label1=new QLabel();
label1->setText("label1");
label1->show();
label1->resize(200,200);
QLabel *label2=new QLabel(w1);
label2->setText("LABEL2");
w1->resize(200,200);
label2->show();
label2->resize(150,150);
w1->show();
return a.exec();
delete label1;
// delete label2;
delete w1;
}

这段程序定义了一个QDialog :w1,两个QLabel: label1和label2.
在这里需要注意的是所有的定义都使用new()开辟空间,所以在最后都需要执行delete操作。
如:

1
2
QDialog *w1=new QDialog();
delete w1;

在这段程序里我们分析各个部件之间的关系。因为label1没有绑定任何父类,所以他是一个独立的窗口,而label2在新定义的时候, QLabel *label2=new QLabel(w1);就被绑定上了w1所以其父是w1.
所以有如下的一些特点:

  1. label1可以单独显示,而label2不可以单独显示,如果显示w1则显示w1的全部子部件,即label2也被显示出来。
  2. 在delete的时候,label1和label2都可以单独被销毁,但是如果如果w1被销毁,那么w1的所有子部件也全部被销毁。

    窗口类型

    QT有非常多的窗口类型,QWidget的构造函数有两个参数
    一个是QWidget *parent=0 这个参数主要负责该窗口部件的附属关系,默认是0,表示是一个独立窗口,两一个参数是
    Qt::WindowFlags这个参数主要负责的是这个窗口部件的类型。
    比如我们可以

    1
    2
    QDialog *w1=new QDialog(0,Qt::Dialog);
    QLabel * label1=new QLabel(0,Qt::SplashScreen);

    其效果:

    也可以使用位或操作如:

    1
    2
    3
    QDialog *w1=new QDialog(0,Qt::Dialog|Qt::FramelessWindowHint);
    QLabel * label1=new QLabel(0,Qt::SplashScreen|Qt::WindowStaysOnTopHint);


    更加详细的样式,用到再说。

    窗口的几何布局


    这里的函数主要分为两类,一类是包含框架的,另一个事不包含框架的。

  3. 包含框架的:x(),y(),frameGemetry(),pos(),move()函数
  4. 不包含框架的:genmetry(),width(),height(),rect()和size()函数。
    实例程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include<QApplication>
    #include<QDialog>
    #include<QWidget>
    #include<iostream>
    using namespace std;
    int main(int argc,char *argv[])
    { QApplication a(argc,argv);
    QWidget w;
    int x=w.x();
    int y=w.y();
    QRect gemetry=w.geometry();
    QRect frame=w.frameGeometry();
    return a.exec();
    }

其中

1
2
int x=w.x();
int y=w.y();

分别返回窗口部件的坐标值x,y,他们的默认值是0.

而geometry和frameGeometry()函数分别返回没有边框的和包含边框矩形的值,其返回值是QRect类型的,就是一个矩形,他的形式是(x,y,height,width)
在这里我们使用QDebug进行调试。
程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<QApplication>
#include<QDialog>
#include<QWidget>
#include<QDebug>
using namespace std;
int main(int argc,char *argv[])
{ QApplication a(argc,argv);
QWidget w;
int x=w.x();
int y=w.y();
QRect gemetry=w.geometry();
QRect frame=w.frameGeometry();
qDebug()<<x<<" "<<y<<" "<<gemetry<<" "<<frame;
return a.exec();
}

在引入了QDebug头文件之后,可以直接使用qDebug()函数
qDebug()<<x<<" "<<y<<" "<<gemetry<<" "<<frame;这句语句可以输出。
其结果如下:

坚持原创技术分享,您的支持将鼓励我继续创作!