1. 程式人生 > >Qt學習筆記4——視窗和控制元件

Qt學習筆記4——視窗和控制元件

1.1 視窗定義

視窗:當一個部件沒有嵌入到其他部件中,則把這個部件叫作視窗或者頂層視窗,頂層視窗是沒有父視窗的,一般的,這些視窗都會被列在工作列中。通常,一個視窗會包含有標題欄,視窗邊框等。如果一個視窗具有父類,則這個視窗被稱為是次級視窗,例如設定了父類的QDialog就是次級視窗,而這些視窗不會被列在工作列中,而是在各自的父視窗之上。

控制元件:當一個視窗嵌入到其它視窗中,則它本身的標題欄會隱藏,那這些視窗就叫作控制元件,也可以叫作非頂層視窗或子視窗。

父視窗,子視窗:當部件1嵌入到部件2中,就把部件2稱作是部件1的父視窗,而部件1是部件2的子視窗。

下圖,MyFirstWidget是視窗,TextLabel,ComboBox,PushButton,LineEdit,CheckBox等都是控制元件,並且它們的父視窗是MyFirstWidget。這裡寫圖片描述

在Qt中主要有三種頂層視窗:

QWidget:最基礎的視窗,所有視窗及控制元件都繼承QWidget。

QDialog:對話方塊視窗,可類比Windows中的對話方塊。

QMainWindow:主視窗,一般主視窗會包括標題欄,選單欄,工具欄, 中心部件,停靠視窗,狀態列等。可類比桌面應用程式。

1.2 驗證父子視窗 學習就是不知疲倦的寫程式碼,寫的多了,意思就明白了

程式碼如下: 新建專案ParentChildWidget,類名ParentChildWidget,基類選擇QWidget。

在main.cpp包含QPushButton,輸入如下程式碼

#include "parentchildwidget.h"
#include <QApplication>
#include <QPushButton>

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

    QPushButton buttonWindow;
    buttonWindow.setText("我是視窗");
    buttonWindow.show();
    buttonWindow.resize(200, 100);

    return a.exec();
}

在parentchildwidget.cpp中,包含QPushButton,在建構函式中新增如下程式碼

#include <QPushButton>
#include "parentchildwidget.h"
#include "ui_parentchildwidget.h"

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

    QPushButton* buttonChild = new QPushButton(this);
    buttonChild->setText("我是控制元件");
}

ParentChildWidget::~ParentChildWidget()
{
    delete ui;
}

執行程式,注意檔案以utf-8編碼儲存,否則顯示亂碼。

結果會看到有兩個視窗同時執行,一個button成為頂層視窗,另一個button因為設定了父視窗,所以成為控制元件,同時標題欄被隱藏。

這裡寫圖片描述

1.3 父子視窗特性

現在修改main函式

#include "parentchildwidget.h"
#include <QApplication>
#include <QPushButton>

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

//    QPushButton buttonWindow;
//    buttonWindow.setText("我是視窗");
//    buttonWindow.show();
//    buttonWindow.resize(200, 100);

    return a.exec();
}

修改parentchildwidget.cpp建構函式

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

    for (int i = 1; i <= 3; ++i)
    {
        QPushButton* buttonChild = new QPushButton(this);
        buttonChild->setText(QString("我是控制元件%1").arg(i));
        buttonChild->resize(100*i, 100);
        connect(buttonChild, SIGNAL(clicked()), buttonChild, SLOT(close()));
    }
}

這裡寫圖片描述

我們看到視窗中只有一個按鈕(我是控制元件3),點選按鈕,出現我是控制元件2,再點擊出現我是控制元件1,並且所有的按鈕都在視窗的左上角。

其實,控制元件1和控制元件2都被控制元件3遮蓋住了。從這個例子中,可以得出以下結論:

1.子視窗的座標系是以父視窗的座標系為基準的,並且預設情況下定位在父視窗的(0,0)點處,視窗的(0,0)點都是在視窗繪圖區域的左上角。水平方向向右為正,垂直方向向下為正。可以呼叫move()函式讓控制元件重新定位,如果傳遞給它負值,其左上角會移出父視窗的可見區域,則該控制元件也只繪製可見部分的區域。

2.後建立的控制元件會覆蓋在先建立的控制元件上。

--------------------- 本文來自 _毛哥 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/mao_hui_fei/article/details/79595759?utm_source=copy