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