Qt窗口部件與布局之一:窗口部件


從這一章開始正式接觸Qt的窗口部件。在第2章曾看到 Qt Creator 提供的默認基類只有 QMainWindow、QWidget 和 QDialog 這3種。QMainWindow 是帶有菜單欄和工具欄的主窗口類,QDialog 是各種對話框的基類,而它們全部繼承自 QWidget。不僅如此,其實所有的窗口部件都繼承自 QWidget,如下圖所示。這一章會講解 QWidge、QDialog 和其他一些常用部件類, 而 QMainWindow 將在第5章講解。



一、基礎窗口部件 QWidget

QWidget 類是所有用戶界面對象的基類,被稱為基礎窗口部件。在圖3-1中可以 看到,QWidget 繼承自 QObject 類和 QPaintDevice 類,其中 QObject 類是所有支持Qt對象模型(Qt Object Model)的基類,QPaimDevice 類是所有可以繪制的對象的基類。 這一節先講解Qt窗口部件的概念和窗口類型,然后再講解Qt窗口的幾何布局,最后講解Qt程序調試方面的內容。

1.1 窗口與窗口部件

先來看一個例子。打開QtCreator,新建空的Qt項目,項目名稱為myWidget1。然后往項目中添加C++源文件“main.cpp”,並添加以下代碼:

#include <QApplication>
#include <QDialog>
#include <QLabel>

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);

    //新建QWidget對象,默認parent參數是nullptr,所以它無父窗口,不是窗口部件,而是個窗口
    //Qt::Dialog: Indicates that the widget is a window that should be decorated as a dialog.
    QWidget *widget = new QWidget(nullptr,Qt::Dialog);
    //設置窗口標題
    widget->setWindowTitle(QObject::tr("我是widget"));

    //新建QLabel對象,默認parent參數是nullptr,所以它無父窗口,是個窗口
    QLabel *label = new QLabel(nullptr,Qt::SplashScreen);
    label->setWindowTitle(QObject::tr("我是label"));
    //設置要顯示的信息
    label->setText(QObject::tr("label:我是個窗口"));
    //改變窗口部件大小,以便能顯示出完整的內容
    label->resize(300,40);

    //label2指定了父窗口為widget,所以是widget的窗口部件,而不是窗口
    QLabel *label2 = new QLabel(widget);
    label2->setText(QObject::tr("label2:我不是獨立窗口,只是widget的子部件"));
    label2->resize(300,20);

    //在屏幕上顯示出來
    label->show();
    widget->show();

    //事件循環
    int ret = a.exec();

    //結束時間循環后,釋放申請的內存
    delete label;
    delete  widget;

    return ret;
}

程序中定義了一個 QWidget 類對象的指針 widget 和兩個 QLabel 對象指針 labe1 與 label2 ,其中 labe1 沒有父窗口,而 label2 在 widget 中, widget 是其父窗口。然后運行程序,效果如下圖所示。

窗口部件(Widget):這里簡稱部件,是 Qt 中建立用戶界面的主要元素。像主窗口、對話框、標簽、還有以后要介紹到的按鈕、文本輸人框等都是窗口部件。

Qt 中把沒有嵌入到其他部件中的部件稱為窗口,一般窗口都有邊框和標題欄,就像程序中的 widget 和 label —樣。QMainWindow 和大量的 QDialog 子類是最一般的窗口類型。窗口就是沒有父部件的部件,所以又稱為頂級部件。與其相對的是非窗口部件,又稱為子部件。


1.2 窗口幾何布局

對於一個窗口,往往要設置它的大小和運行時出現的位置,這就是本小節要說的窗口幾何布局。對於窗口的大小和位置,根據是否包含邊框和標題欄兩種情況,要用不同的函數來獲取。可以在幫助索引中查看Window and Dialog Widgets關鍵字,文檔中顯示了窗口的幾何布局圖,如下圖所示。

這里的函數分為兩類,一類是包含框架的,另一類是不包含框架的:

  • 包含框架:x()、y()、frameGeometry()、pos()和 move() 等函數;
  • 不包含框架:geometry()、width()、height()、rect()和 size() 等函數。

x()、y() 分別返回部件的位置坐標的x、y值,它們的默認值為0。而 geometry() 和 frameGeometry() 函數分別返回沒有邊框和包含邊框的窗口框架矩形的值,其返回值是 QRect 類型的,就是一個矩形,它的形式是(x,y,寬,髙)。


二、其他窗口部件

2.1 QFrame 類族

QFrame 類是帶有邊框的部件的基類,它的子類有最為常用的標簽部件 QLabel,另外還有 QLCDNumber、QSplitter、QStackedWidget、QToolBox 和 QAbstractScrollArea類。QAbstractScrollArea 類是所有帶有滾動區域的部件類的抽象基類,這里需要說明,在Qt中凡是帶有 Abstract 字樣的類都是抽象基類。對於抽象基類,我們是不能直接使用的,但是可以繼承該類實現自己的類,或者使用它提供的子類。QAbstractScrollArea 的子類中有最常用的文本編輯器類 QTextEdit 類和各種項目視圖類。

帶邊框部件最主要的特點就是可以有一個明顯的邊界框架。QFrame 類的主要功能也就是用來實現不同的邊框效果,這主要是由邊框形狀(Shape)和邊框陰影(Shadow)組合來形成的。 QFrame 類中定義的主要邊框形狀如下圖1和圖2所示。其中,lineWidth 是邊框邊界的線的寬度;而 midLineWidth 是在邊框中額外插入的一條線的寬度,作用是形成3D效果,並且只在Box、Hline和VLine表現為凸起或者凹陷時有用。QFrame 的這些元素組合成的所有邊框效果,如下圖3所示。

因為下面要講的部件都是QFrame類的子類,也都是Qt的標准部件,所以大多會在Qt設計器中直接設置其屬性。能在屬性欄中設置的屬性,其類中就一定有相關的函數可以使用代碼來實現, 只要根據名字在類的參考文檔中查找就可以了。

(1)QLabel

標簽 QLabel 部件用來顯示文本或者圖片。在設計器中往界面拖人一個 Label,然后將其拖大,並在屬性欄中設置其對齊方式為 alignment 屬性,水平的改為 AlignHCenter,垂直的改為AlignVCenter,這樣 QLabel 中的文本就會顯示在正中間。屬性欄中還有一個 wordwrap,選中它就可以實現文本的自動換行。下面看一下怎么在標簽中使用圖片。首先在 mywidget. cpp 文件中添加頭文件 #include <QPixmap>,然后在 MyWidget 類的構造函數中添加一行代碼:

ui->label->setPixmap(QPixmap("F:/logo.png"));

這樣就可以在標簽中顯示 F 盤中的“logo, png”圖片了。顯示圖片時使用了圖片的絕對路徑“F:/logo. png”,這樣需要指明盤符,也可以使用相對路徑。最好的方法是使用資源管理器,將圖片放到程序中。在QLabel中還可以顯示 gif 動態圖片,在 mywidget. cpp 中添加頭文件 #include <QMovie>,然后在 myWidget 的構造函數中繼續添加代碼:

QMovie *movie = new QMovie("F:/donghua.gif");
ui->label->setMovie(movie);
movie->start();

(2)QLCDNumber
QLCDNumber部件可以讓數碼顯示與液晶數字一樣的效果。在 QLCDNumber 中可以顯示的數碼有0/O、1、2、3、4、5/S、6、7、8、9/g、負號、A、B、C、D、E、F、h、H、L、O、P、r、u、U、Y 、冒號、度符號(輸入時使用單引號來代替)和空格。


(3)QStackedWidget
QStackedWidget 類提供了一個部件棧,可以有多個界面(稱為頁面),每個界面可以擁有自己的部件,不過每次只能顯示一個界面。對於這個部件,需要使用 QComboBox 或者 QListWidget 來選擇它的各個頁面。

在設計模式中向界面拖入一個 ListWidget 和一個 Stacked Widget。 在 List Widget 上右擊 ,選擇“編輯項目 ”菜單,然后在編輯列表窗口部件對話框中按下左下角的加號添加兩項,並更改名稱為“第一頁”和“第二頁”。然后在 Stacked Widget 上拖一個 Label,更改文本為“第一頁”,然后再單擊 Stacked Widget 右上角的小箭頭進人下一頁,再拖人一個標簽,更改文本為“第二頁”, 然后再將Stacked Widget部件的 frameShape 屬性更改為 StyledPanel 。

最后在信號和槽設計模式,將 HstWidget 部件的 currentRowChanged() 信號和 stackedWidget 的 setCurrent 槽關聯。設置完成后運行程序,效果如下圖所示。可以看到,現在可以單擊 listWidget 中的項目來選擇 stackedWidget 的頁面了。也可以在設計模式中在stackedWidget 上右擊來添加新的頁面。


(4)QToolBox
QToolBox類提供了一列層疊窗口部件,就像最常用聊天工具QQ中的抽屜效果。從部件欄中選擇Tool Box拖入到我們界面上。在上面右擊,選擇“插人頁→在當前頁之后”菜單項來新插入一頁。然后更改其 frameShape 屬性為 Box,並分別單擊各個頁的標簽,更改其 curremltemText 分別為“好友”,“黑名單”和“陌生人”。然后運行程序,效果如圖3-11所示。



2.2 按鈕部件

QAbstractButton 類是按鈕部件的抽象基類,提供了按鈕的通用功能。它的子類包括復選框 QCheckBox、標准按鈕QPushButton、單選框按鈕QRadioButton 和工具按鈕 QToolButton。關於這一節,可以參考歡迎中的示例程序 Group Box Example,它在 Widgets 分類中。


(1)QPushButton
QPushButton 部件提供了 一個標准按鈕。將按鈕的顯示文本設置為英文字母,在首字母前添加"&"符號,那么就可以將這個按鈕的快捷鍵設置為 Alt 加上這個字母。其它更多的功能可以查看幫助文檔,這里由於篇幅問題就不再介紹了。


(2)QCheckBox、QRadioButton和QGroupBox
對於調查表之類的應用,往往提供多個選項供選擇。有些是可以選擇多項的,有些只能選擇其中一項。復選框 QCheckBox 類提供了同時選擇多項的功能,而 QRadioBimon 提供了只能選擇一項的功能,一般要把一組按鈕放到一個QGroupBox中來進行管理。其它更多的功能可以查看幫助文檔,這里由於篇幅問題就不再介紹了。


2.3 行編輯器

行編輯器QLineEdit部件是一個單行的文本編輯器,允許用戶輸人和編輯單行的純文本內容,而且提供了一系列有用的功能,包括撤銷與恢復、剪切和拖放等操作。其中剪切笈制等功能是行編輯自帶的,不用自己編碼實現。一些具體功能,可以査看Qt歡迎中的示例程序 Line Edits,它在 Widgets 分類中,這里由於篇幅問題就不再介紹了。


2.4 數值設定框

QAbstractSpinBox 類是一個抽象基類,提供了一個數值設定框和一個行編輯器來顯示設定值。它有3個子類 QDateTimeEdit、QSpinBox 和 QDoubleSpinBox 分別用來完成日期時間、整數和浮點數的設定。關於這一小節,可以查看 Widgets 分類下的 Spin Boxes 示例程序,這里由於篇幅問題就不再介紹了。


2.5 滑塊部件

QAbstractSlider 類提供了一個區間內的整數值,有一個滑塊,可以定位到一個整數區間的任意值。這個類是一個抽象基類,有3個子類 QScrollBar、QSlider 和 QDial。 其中,滾動條 QScrollBar 更多用在 QScrollArea 類中來實現滾動區域;而 QSlider 是最常見的音量控制或多媒體播放進度等滑塊;QDial是一個刻度表盤。關於這些部件,可以參考 Widgets 分類下的 Sliders 示例程序,這里由於篇幅問題就不再介紹了。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM