天天看点

Qt不用布局类挂载(增加)界面控件和显示界面控件的基本原理和示例代码(setGeometry()、QPushButton)

很久以前学QT时,经常按照例子打了,发现显示不了控件。这是因为图形控件都是从QWidget继承而来,而QWidget是一个基本界面,要显示的话,需要调用其槽函数show()。当我们不用布局类时,用这种方式可以直接显示界面控件。但是,有时会出现用了show()槽函数,也会不显示控件的情况。为什么会这样呢?这是因为我们没有设置控件初始大小,系统默认宽高为0,所以显示不出来,只需要设置控件大小即可,用函数resize(960,640)即可。

优点:用控件自身的槽函数show()显示控件、用setGeometry()显示控件位置,这种方式的优点是可以任意布局,并且两个控件可以重叠,能够做出许多复杂效果。

其原理是:界面控件类本身是继承QWidget的,挂载控件界面本质是在指定界面的某个位置显示这些控件类。这就相当于我们弹出一个widget一样,只是我们界面控件是直接嵌入到某个QWidget(也就是以该QWidget为父类)界面里面。

其中,Windows界面可以分为模态对话框和非模态对话框,QWidget可以显示这两种模式,具体的原理和显示方法和看我这篇博客:https://blog.csdn.net/naibozhuan3744/article/details/92767271

本文主要总结这种用法跟布局类用法不同点(两种方法也可以混合使用)。

a1 当一个QWidget界面用了布局类时,则该QWidget界面可以用这种方式挂载另外的控件,混合布局

a2 当在一个QWidget界面添加一个控件界面时,该控件界面的父类需要设置为QWidget界面,并且要手动设置该控件界面的大小和调用槽函数show,才会显示出来;

a3 当控件界面的父类为空指针nullprt,则调用该控件界面,设置初始大小,并且调用槽函数show,显示时,初始坐标是在整个屏幕左上角,而不是QWidget界面内。

一、下面是一个具体的实例

实例代码主要创建两个按钮,然后第一个按钮的父类为QWidget控件,第二个按钮的父类为空nullprt;然后结果显示第一个按钮在QWidget界面内,第二个按钮在整个屏幕左上角。

1.1新建一个widget工程,勾选UI选型,然后分别在widget.h、widget.cpp、main.cpp中添加如下代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void setupUI();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
           

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setupUI();
}

Widget::~Widget()
{
    delete ui;
    qDebug()<<"执行了析构函数";
}

void Widget::setupUI()
{
    QPushButton *button1=new QPushButton("父控件为Widget内",this);
    button1->setFixedSize(150,50);
    button1->setGeometry(0,0,0,0);
    button1->show();

    QPushButton *button2=new QPushButton("父控件为null内,则屏幕左上角为起始点");
    button2->setFixedSize(300,150);
    button2->setGeometry(0,0,0,0);
    button2->show();
}
           

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}
           

1.2程序运行结果如下所示

Qt不用布局类挂载(增加)界面控件和显示界面控件的基本原理和示例代码(setGeometry()、QPushButton)

参考内容:

https://blog.csdn.net/zgrjkflmkyc/article/details/8644226(参考:不用布局类添加控件)

https://blog.csdn.net/caomin1hao/article/details/80388760(参考:QWidget增加了布局后,子类可以不用布局挂载控件)