Qt 入門 5 之其他窗口部件
- 本文介紹的窗口部件直接或間接繼承自 QWidget 類
- 詳細介紹其他部件的功能與使用方法
1. QFrame 類
-
QFrame類是帶有邊框的部件的基類。它的子類包括最常用的標簽部件QLabel另外還有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol1Area類。QAbstractScrollArea類是所有帶有滾動區域的部件類的抽象基類,這里需要說明,Qt中凡是帶有Abstract字樣的類都是抽象基類。抽象基類是不能直接使用的,但是可以繼承該類實現自己的類,或者使用它提供的子類。QAbstractScrollArea的子類中有最常用的文本編輯器類QTextEdit類和各種項目視圖類,這些類會在后面章節中接觸到,這里不再講解
-
帶邊框部件最主要的特點就是可以有一個明顯的邊界框架。QFrame類的主要功能就是用來實現不同的邊框效果,這主要是由邊框形狀(Shape)和邊框陰影(Shadow)組合來形成的。QFrame類中定義的主要邊框形狀如表3-1所列,邊框陰影如表3-2所列。這里要說明兩個名詞:lineWidth和midLineWidth,其中,lineWidth是邊框邊界線的寬度;而midlineWidth是在邊框中額外插入的一條線的寬度,這條線的作用是為了形成3D效果,并且只在Box、Hline和VLine 表現為凸起或者凹陷時有用。QFrame的這些元素組合成的所有邊框效果如圖3-12所示。
-
下面在程序中演示一下具體效果。新建 Qt Widgets應用項目,命名為 myframe,完成后進入項目.ui文件 拖一個 Frame到界面上,后打開mywidget.ui文件,在Qt設計器中從部件列表里拖入一個Frame 到界面上,然后在右下方的屬性欄中更改其
frameShape為Box,frameShadow為Sunken,lineWidth為5,midLineWidth為10。
在屬性欄中設置部件的屬性,這和在源碼中用代碼實現是等效的,其實也可以直接在mywidget.cpp
文件中的MyWidget構造函數里使用如下代碼來代替:
//與ui設計等效ui->frame->setFrameShape(QFrame::Box);ui->frame->setFrameShadow(QFrame::Sunken);//以上兩個函數可以使用setFrameStyle(QFrame::Box|QFrame::Sunken)代替ui->frame->setLineWidth(5);ui->frame->setMidLineWidth(10);
-
效果如下:
-
下面要講的部件大都是Qt 的標準部件,所以大多會在Qt設計器中直接設置其屬性,同樣也可通過相應的代碼實現。
-
對于QFrame的子類,都繼承了他的邊框設置功能。
1.1 QLabel
-
標簽QLabel部件用來顯示文本或者圖片。在設計器中向界面拖入一個Label,然后將其拖大點,并在屬性欄中設置對其方式alignment的屬性,水平的改為AlignHCenter,垂直的改為 AlignVCenter,這樣QLabel中的文本就會在正中間顯示。
-
font屬性可以對字體進行設置,也可以通過代碼進行設置,下面打開mywidget.cpp文件,在構造函數中添加如下代碼:
//QLabelQFont font;font.setFamily("華文行楷");font.setPointSize(20);font.setBold(true);font.setItalic(true);ui->label->setFont(font);
- QFont類提供了對字體的設置,這里使用了“華文行楷”字體族、大小為20、加粗斜體,通過QLabel的setFont()函數可以使用新建的字體
- QLabel屬性欄中的wordWrap屬性可以實現文本的自動換行。如果文本過長時不想自動換行,而是在后面自動省略,那么可以使用QFontMetrics類,該類用來計算給定字體的字符或字符串的大小,其中包含了多個實用函數。要使用QFontMetrics,則可以通過創建對象的方式,或通過QWidget::fontMetrics()來返回當前部件字體的QFontMetrics對象。下面繼續在構造函數中添加代碼:
QString string=tr("標題太長,需要進行省略!");QString str=ui->label->fontMetrics().elidedText(string,Qt::ElideRight,180);ui->label->setText(str);
- QFontMetrics 類的elidedText()函數用來進行文本省略,第一個參數用來指定要省略的文本;第二個參數是省略模式,就是“…”省略號出現的位置,包括Qt;:Elidel,eft出現在文本開頭、Qt::ElideMiddle出現在文本中間,以及這里使用的 Qt;:ElideRight出現在文本末尾;第三個參數是文本的長度,單位是像素,只要第一個參數指定的文本的長度超過了這個值,就會進行省略。可以運行程序,調整參數值,從而查看不同參數的效果。
- QLabel屬性欄中的scaledContents屬性可以實現縮放標簽中的內容,比如在標簽中放一張較大的圖片,則可以選中該屬性來顯示整個圖片。下面來看一下怎么在標簽中使用圖片。首先在mywidget.cpp文件中添加頭文件#include,然后在構造函數中添加一行代碼:
ui->label->setPixmap(QPixmap("E:/logo.png"));
- 那么只需要使用相對路徑logo.png就可以了。其實,最好的方法是使用資源管理器,將圖片放到程序中,這會在第5章講述。QLabel中還可以顯示gif動態圖片,在mywidget.cpp中添加頭文件#include ,然后在myWidget 的構造函數中繼續添加代碼:
QMovie * movie=new QMovie("E:/donghua.gif");
ui->label->setMovie(move); //在標簽中添加動畫
movie->start(); //開始播放
1.2 QLCDNumber
- QLCDNumber部件可以讓數碼字符顯示類似液晶數字一樣的效果。從部件欄中拖入一個 LCD Number部件到界面上,然后更改其屬性:選中smallDecimalPoint 項這樣可以顯示小數點;digitCount的作用是設置顯示的數字的個數,設置為7,表示要顯示7個數字;mode選Dec表示顯示十進制數值,這里還可以設置顯示為十六進制(Hex)、八進制(Oct)和二進制(Bin)數值;segmentStyle用來設置數碼的顯示樣式,這里提供了3種樣式,選擇Filed;最后將value設置為456.123,這就是要顯示的數值,也可以在代碼中使用display()函數來設置要顯示的數值。設置好后,運行程序查看效果。在 QLCDNumber中可以顯示的數碼有0/0、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、冒號、度符號(輸人時使用單引號來代替)和空格
1.3 QStackedWidget
-
QStackedWidget類提供了一個部件棧,可以有多個界面(稱為頁面),每個界面可以擁有自己的部件,不過每次只能顯示一個界面。這個部件需要使用QComboBox或者 QListWidget來選擇它的各個頁面。在設計模式中向界面上拖入一個List Widget和一個 Stacked Widget。在 List Widget上右擊,在彈出的級聯菜單中選擇“編輯項目”項,然后在“編輯列表窗口部件”對話框中按下左下角的加號添加兩項,并更該名稱為“第一頁”和“第二頁”。然后在 Stacked Widget 上拖入一個 Label,更改文本為“第一頁”,再單擊 Stacked Widget 右上角的小箭頭進入下一頁,再拖入一個標簽,更改文本為“第二頁”。然后再將 Stacked Widget部件的frameShape 屬性更改為 StyledPanel.最后,在信號和槽設計模式將listWidget部件的currentRowChanged()信號和stackedWidget的 setCurrentIndex()槽關聯。設置完成后運行程序可以看到,現在可以單擊 listWidget中的項目來選擇stackedWidget的頁面了。可以在設計模式中在 stackedWidget 上右擊來為它添加新的頁面
-
運行如下:
1.4 QToolBox
- QTooIBox類提供了一列層疊窗口部件,就像常用的聊天工具 QQ中的抽屜效果從部件欄中選擇ToolBox拖入到界面上,右擊并在彈出的級聯菜單中選擇“插入頁一在當前頁之后”項來新插入一頁。然后更改其frameShape屬性為Box,并分別單擊各個頁的標簽,更改其 currentltemText 分別為“好友”、“黑名單”和“陌生人”。完成后可以運行程序查看效果
2.按鈕部件
- QAbstractButton類是按鈕部件的抽象基類,提供了按鈕的通用功能。它的子類包括復選框 QCheckBox、標準按鈕 QPushButton、單選框按鈕 QRadioButton 和工具按鈕 QToolButton。QToolButton會在后邊講到,這一小節的內容可以參考示例程序Group Box Example.
- 新建QtWidgets應用,項目名稱mybutton,基類選擇QWidget,類名設為MyWidget。完成后在項目文件夾中新建images 文件夾,并且放入幾張圖標圖片,供下面編寫程序時使用。
2.1 QPushButton
QPushButton 提供一個標準按鈕。在項目中打開mywidget.ui文件,拖入3個PushButton 到界面上,然后將它們的objectName 依次更改為pushBtn1、pushBtn2和pushBtn3。下面選中pushBtn1的checkable屬性,使得它可以擁有“選中”和“未選中”兩種狀態;再選中pushBtn2的flat屬性,可以不顯示該按鈕的邊框,然后轉到pushBtn1 的toggled(bool)信號的槽,更改如下:
void MyWidget::on_pushButton1_toggled(bool checked) //按鈕是否處于被按下狀態
{qDebug()<<tr("按鈕是否被按下:")<<checked;
}
-
運行如下,當pushBtn1 處于按下狀態的時候,checked 為true,否則為false。
-
下面再MyWidget類構造函數中添加代碼:
MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);ui->pushButton1->setText(tr("&nihao"));ui->pushButton2->setText(tr("幫助&H"));//ui->pushButton2->setIcon(QIcon("../mybutton/images/help.png"));ui->pushButton3->setText(tr("z&oom"));QMenu* menu=new QMenu(this);menu->addAction(QIcon("../mybutton/images/zoom-in.png"),tr("放大"));ui->pushButton3->setMenu(menu);}
- 代碼里為3個按鈕改變了顯示文本,在一個字母前加上“&”符號,則可以將這個按鈕的加速鍵設置為Alt加上這個字母。如果要在這個文本中顯示“&”符號,可以使用"&&"。也可以i使用setIcon()函數來給按鈕添加圖標,這里的圖片文件使用了相對路徑(當然也可以在設計模式通過更改icon屬性來實現)。對于pushBtn3,這里為其添加了下拉菜單,現在這個菜單什么功能也沒實現,運行程序可以查看效果如下:
2.2 QCheckBox、QRadioButton 和 QGroupBox
- 對于調查表之類的應用,往往提供多個選項供選擇,有些是可以選擇多項的,有些只能選擇其中一項。復選框 QCheckBox類提供了同時選擇多項的功能,而QRadioButton 提供了只能選擇一項的功能,一般要把一組按鈕放到一個QGroupBox中來管理。
- 在設計模式時可往界面上拖入兩個GroupBox,將它們的標題分別改為“復選框和“單選框”。然后往復選框中拖人3個CheckBox,分別更改顯示內容為“跑步”、“踢球”和“游泳”。再往單選框中拖入3個RadioButton,分別更改其顯示內容為“很好”“一般”和“不好”。這里還可以選中CheckBox的tristate屬性,讓它擁有不改變狀態選中狀態和未選中狀態3種狀態。對于選擇按鈕后的操作,可以關聯它們的state-Changed()信號和自定義的槽,也可以使用isChecked()函數查看一個按鈕是否被選中。除了 Group Box,還可以使用 QButtonGroup 類來管理多個按鈕。
3. QLineEdit
- 行編輯器 QLineEdit部件是一個單行的文本編輯器,它允許用戶輸入和編輯單行的純文本內容,而且提供了一系列有用的功能,包括撤銷與恢復,剪切和拖放等操作其中,剪切復制等功能是行編輯自帶的,不用自己編碼實現,拖放功能會在第5章講到這部分內容可以查看Qt的示例程序Line Edits。
- 新建Qt Widgets應用,項目名稱 mylineedit,基類QWidget,類名MyWidget。在設計模式時可往界面上拖入幾個標簽和 Line dit,設計界面如圖3-13所示。然后將4個Line Edit 從上到下依次更改其objectName 為lineEditl 、lineEdit2 、lineEdit3 和 lineEdit4
3.1 顯示模式
-
行編輯器QLineEdit 有四種顯示模式(echoMode),可以echoMode屬性中更改他們,分別是:
- Normal正常顯示輸入的信息;
- NoEcho不顯示任何輸人,這樣可以保證不泄露輸入的字符位數;
- Password顯示為密碼樣式,就是以小黑點或星號之類的字符代替輸人的字符;
- PasswordEchoOnEdit在編輯時顯示正常字符,其他情況下顯示為密碼樣式。- 這里設置lineEditl的echoMode為Password。
3.2 輸入掩碼
-
QLineEdit 提供了輸入掩碼(inputMask)來限制輸入的內容。可以使用一些特殊的字符來設置輸入的格式和內容,這些字符中有的起限制作用且必須要輸入一個字符,有的只是起限制作用,但可以不輸入字符而是以空格代替。
-
先來看一下這些特殊字符的含義:
-
在lineEdit2上右擊,然后轉到它的returnPressed()回車鍵按下信號的槽中,更改如下:
void MyWidget::on_lineEdit2_returnPressed() //回車鍵按下信號的槽
{ui->lineEdit3->setFocus(); //讓lineEdit3 獲取焦點qDebug()<<ui->lineEdit2->text(); //輸出lineEdit的內容qDebug()<<ui->lineEdit2->displayText(); //輸出lineEdit2顯示的內容
}
3.3 輸入驗證
- 在QLineEdit 中還可以使用驗證器(validator)來對輸入進行約束。在mywidget.cpp 文件的構造函數中添加代碼:
//新建驗證器,指定范圍 100-999QValidator* validator=new QIntValidator(100,999,this);//在行編輯器中使用驗證器ui->lineEdit3->setValidator(validator);
- 在代碼中為lineEdit3添加了驗證器,那么它現在只能輸入100~999 之間的數字再進入 lineEdit3的回車鍵按下信號的槽,輸出lineEdit3的內容。然后運行程序會發現,其他的字符無法輸人,而輸入小于100的數字時,按下回車鍵也是沒有效果的QValidator 中還提供了 QDoubleValidator,可以用它來設置浮點數。如果想設置更強大的字符約束,就要使用正則表達式了,這個在第7章會講到,這里舉一個簡單的例子
QRegExp rx("- ? \d{ 1.3 }" );
OValidator*validator =new ORegExpValidator(rx,this);
這樣就可以實現在開始輸入“一”號或者不輸入,然后輸入1~3個數字的限制。
3.4 自動補全
- QlineEdit中也提供了強大的自動補全功能,這是利用QCompleter 類實現的。在MyWidget類的構造函數中繼續添加代碼:
StrinqList wordList;
wordList <"Ωt"<"Qt Creator"< tr("你好");
QCompleter*completer=newQCompleter(wordList,this):/新建自動完成器//設置大小寫不敏感
completer->setCaseSensitivity(Ot::CaseInsensitive);
ui->lineEdit4->setCompleter(completer):
要添加#include 頭文件,運行程序,在最后一個行編輯器中輸入"Q",則自動出現 “Qt” 和 “Qt Creator” 兩個選項。QCompleter 的使用可以參考 Qt 的示例程序 Completer。
4. QAbstractSpinBox
- QAbstractSpinBox類是一個抽象基類,提供了一個數值設定框和一個行編輯器來顯示設定值。它有3個子類QDateTimeEdit、QSpinBox 和 QDoubleSpinBox,分別用來完成日期時間、整數和浮點數的設定。
- 下面實戰一下查看SpinBoxes示例程序。新建Qt Widgets應用,項目名稱 myspinbox,基類為QWidget,類名 MyWidget。
4.1 QDateTimeEdit
- QDateTimeEdit 類提供了一個可以說編輯日期和時間的部件。到設計模式,從部件欄中分別拖 Time Edit、Date Edit 和 Date/Time Edit 到界面上,然后設置timeEidt 的 displayFormat 為“h:mm:ssA”,這就可以使用 12 h制來顯示。對于dataEdit,選中他的calendarPopup屬性,就可以使用彈出的日歷部件來設置如期。然后在MyWidget 類的構造函數中添加代碼:
//設置時間為現在的系統時間ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());//設置時間的顯示格式ui->dateTimeEdit->setDisplayFormat(tr("yyyy年MM月dd日dddHH時mm分ss秒"));
- 運行如下,還要說明,可以使用該部件的 text() 函數獲取設置的值,它返回QString 類型的字符串,也可以使用dateTime()函數,它返回QDateTime 類型數據。
4.2 QSpinBox 和 QDoubleSpinBox
- QSpinBox 用來設置整數,QDoubleSpinBox 用來設置浮點數,這兩個部件在前邊的輸入對話框中已經接觸過了。
- 從部件欄中找到SpinBox和Double Spin Box,并將它們拖入到界面上。可以在屬性欄中看到spinBox的屬性有:后綴suffix屬性,可以設置為“%”,這樣就可以顯示百分數了;前綴prefix屬性,比如表示金錢時前面有“¥”字符;最小值 minimum屬性,設置其最小值;最大值maximum屬性設置其最大值;單步值 singleStep屬性設置每次增加的數值,默認為1;value為現在顯示的數值。而 dou-bleSpinBox又增加了一個小數位數 decimals屬性,用來設置小數點后面的位數。關于這兩個部件就不再過多講述,最后提醒大家,可以在代碼中使用value()函數來獲取設置的數值。
5. QAbstractSlider
- QAbstractSlider類用于提供區間內的一個整數值,它有一個滑塊,可以定位到一個整數區間的任意值。該類是一個抽象基類,它有3個子類QScrollBar、QSlider 和QDial。其中,滾動條QScrollBar多數是用在QScrollArea類中來實現滾動區域;QSlider就是常見的音量控制或多媒體播放進度等滑塊部件;QDial是一個刻度表盤部件這些部件可以參考Sliders示例程序。
- 新建QtWidgets應用,項目名稱myslider,基類選擇QWidget,類名為MyWidget。完成后到設計模式,從部件欄中分別將 Dial、Horizontal Scroll Bar 和Vertical Scroll Bar、Horizontal Slider 以及Vertical Slider 等部件拖入到界面上,如下:
- 先看兩個 Scroll Bar 的屬性:maximum屬性用來設置最大值,minimum 屬性用來設置最小值;singleStep屬性是每步的步長,默認是1,就是按下方向鍵后其數值增加或者減少1;pageStep是每頁的步長,默認是10,就是按下PageUp或者PageDown按鍵后,其數值增加或者減少10;value與sliderPosition是當前值;tracking設置是否跟蹤,默認為是,就是在拖動滑塊時,每移動一個刻度,都會發射valueChanged()信號,如果選擇否,則只有拖動滑塊釋放時才發射該信號;orientation設置部件的方向,有水平和垂直兩種選擇;invertedAppearance屬性設置滑塊所在的位置,比如默認滑塊開始在最左端,選中這個屬性后,滑塊默認就會在最右端。invertedControls設置反向控制,比如默認是向上方向鍵是增大,向下方向鍵是減小,如果選中這個屬性,那么控制就會正好反過來。另外,為了使部件可以獲得焦點,需要將focusPolicy設置為StrongFocus。
- -再來看兩個 Slider,它們有了自己的兩個屬性 tickPosition和tickInterval,前者用來設置顯示刻度的位置,默認是不顯示刻度;后者是設置刻度的間隔。
- 而Dial有自己的屬性wrapping,用來設置是否首尾相連,默認開始與結束是分開的;屬性notchTarget 用來設置刻度之間的間隔;屬性notchesVisible用來設置是否顯示刻度。
- 再往界面上拖人一個Spin Box,然后進人信號和槽編輯界面,將刻度表盤部件 dial的 sliderMoved(int)信號分別與其他各個部件的setValue(int)槽相連接。設置完成后運行程序,然后使用鼠標拖動刻度盤部件的滑塊,可以看到其他所有的部件都跟著變化了。
QQ2025418-204420