Qt不用布局类挂载(增加)界面控件和显示界面控件的基本原理和示例代码(setGeometry()、QPushButton)
很久以前学QT时,经常按照例子打了,发现显示不了控件。这是因为图形控件都是从QWidget继承而来,而QWidget是一个基本界面,要显示的话,需要调用其槽函数show()。当我们不用布局类时,用这种方式可以直接显示界面控件。
优点:用控件自身的槽函数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程序运行结果如下所示
参考内容:
https://blog.csdn.net/zgrjkflmkyc/article/details/8644226(参考:不用布局类添加控件)
https://blog.csdn.net/caomin1hao/article/details/80388760(参考:QWidget增加了布局后,子类可以不用布局挂载控件)
上一篇: QSplitter 分割窗口
下一篇: qt5 鼠标无动作时进入屏保