Label
QLabel 可以?來顯??本和圖?
屬性 | 說明 |
---|---|
text | QLabel中的?本 |
textFormat | ?本的格式. ? Qt::PlainText 純?本 ? Qt::RichText 富?本(?持html標簽) ? Qt::MarkdownText markdown格式 ? Qt::AutoText 根據?本內容?動決定?本格式 |
pixmap | QLabel 內部包含的圖?. |
scaledContents | 設為true表?內容?動拉伸填充 QLabel 設為false則不會?動拉伸 |
alignment | 對??式. 可以設置?平和垂直?向如何對?. |
wordWrap | 設為true內部的?本會?動換?. 設為false則內部?本不會?動換?. |
indent | 設置?本縮進.?平和垂直?向都?效. |
margin | 內部?本和邊框之間的邊距. 不同于于indent,但是是上下左右四個?向都同時有效. ?indent最多只是兩個?向有效(具體哪兩個?向有效取決于alignment) |
openExternalLinks | 是否允許打開?個外部的鏈接. (當QLabel?本內容包含url的時候涉及到) |
buddy | 給QLabel關聯?個"伙伴",這樣點擊QLabel時就能激活對應的伙伴. 例如伙伴如果是?個QCheckBox,那么該QCheckBox就會被選中 |
代碼?例:顯?不同格式的?本
1)在界?上創建三個 QLabel
尺?放??些.objectName分別為label,label_2,label_3
2)修改widget.cpp,設置三個label的屬性
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//把第一個label設置成顯示純文本ui->label->setTextFormat(Qt::PlainText);ui->label->setText("<b>這是一段純文本</b>");ui->label_2->setTextFormat(Qt::RichText);ui->label_2->setText("<b>這是一段富文本</b>");ui->label_3->setTextFormat(Qt::MarkdownText);ui->label_3->setText("# 這是一段markdown文本");
}
代碼?例:顯?圖?
雖然 QPushButton 也可以通過設置圖標的?式設置圖?,但是并?是?個好的選擇.更多的時候還是希望通過 QLabel 來作為?個更單純的顯?圖?的?式
1)在界?上創建?個QLabel, objectName 為 label
2)創建 resource.qrc ?件,并把圖?導?到qrc中
3)修改widget.cpp,給QLabel設置圖?
QWidget大小800x600
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//先把QLabel設置成和窗口一樣大,并且把這個QLabel左上角設置到窗口左上角這里QRect windowRect = this->geometry();ui->label->setGeometry(0,0,windowRect.width(),windowRect.height());QPixmap pixmap(":/miku.jpg");ui->label->setPixmap(pixmap);
}
miku.jpg的尺寸是1222x903
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//先把QLabel設置成和窗口一樣大,并且把這個QLabel左上角設置到窗口左上角這里QRect windowRect = this->geometry();ui->label->setGeometry(0,0,windowRect.width(),windowRect.height());QPixmap pixmap(":/miku.jpg");ui->label->setPixmap(pixmap);//啟動自動拉伸,圖片就能填充滿整個窗口ui->label->setScaledContents(true);
}
但是一拖動,圖片沒有跟著適應窗口
之前的尺寸設置是一次性的,程序運行起來以后,QLabel的尺寸就固定下來了,窗口發生改變,QLabel不會改變
為了解決這個問題,可以在Widget中重寫resizeEvent函數.
Qt中,表示用戶的操作,有兩類概念一個是信號,另一個是事件~~
當用戶拖拽修改窗口大小的時候,就會觸發resize事件(resizeEvent)
像resize這樣的事件,是連續變化的.把窗口尺寸從A拖到B這個過程中,會觸發出一系列的resizeEvent 此時就可以借助resizeEvent來完成上述的功能
可以讓Widget窗口類,重寫父類(QWidget)的resizeEvent虛函數
在鼠標拖動窗口尺寸的過程中這個函數就會被反復調用執行
每次觸發一個resizeEvent事件都會調用一次對應的虛函數
由于此處進行了函數重寫,調用父類的虛函數就會實際調用到子類的對應的函數(多態)
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void resizeEvent(QResizeEvent *event);
private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QResizeEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//先把QLabel設置成和窗口一樣大,并且把這個QLabel左上角設置到窗口左上角這里QRect windowRect = this->geometry();ui->label->setGeometry(0,0,windowRect.width(),windowRect.height());QPixmap pixmap(":/miku.jpg");ui->label->setPixmap(pixmap);//啟動自動拉伸,圖片就能填充滿整個窗口ui->label->setScaledContents(true);
}Widget::~Widget()
{delete ui;
}// 重寫 resizeEvent. 這個函數會在窗???發?改變時被?動調?.
//此處的形參event是非常有用的,這里就包含了觸發這個resize事件這一時刻,窗口的尺寸的數值
void Widget::resizeEvent(QResizeEvent *event)
{qDebug() << event->size();
}
執?程序,此時改變窗???,圖?也會隨之變化.
于此同時,在控制臺?也能夠看到尺?變化的過程
void Widget::resizeEvent(QResizeEvent *event)
{qDebug() << event->size();// 可以直接通過 this->width() 和 this->height() 設置 label 新的尺?, 也可以通過event 參數拿到新的尺?.// ui->label->setGeometry(0, 0, this->width(), this->height());ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}
此處的 resizeEvent 函數我們沒有?動調?,但是能在窗???變化時被?動調?.這個過程就是依賴C++中的多態來實現的.Qt框架內部管理著QWidget對象表?咱們的窗?.在窗???發?改變時,Qt就會?動調? resizeEvent 函數.
但是由于實際上這個表?窗?的并?是QWidget,?是QWidget的?類,也就是咱們??寫的Widget.此時雖然是通過?類調?函數,但是實際上執?的是?類的函數(也就是我們重寫后的 resizeEvent ).
此處屬于是多態機制的?種經典?法.通過上述過程,就可以把?定義的代碼,插?到框架內部執?.相當于"注冊回調函數“
在實際編程中,指定回調函數其實有很多種寫法:
- 設置函數指針
- 設置仿函數(函數對象)
- 設置lambda
- 通過重寫父類虛函數(框架中拿看父類的指針調用這個函數.如果你創建了子類重寫了這個函數此時在多態機制下,實際執行的就是子類的函數了)
- Qt的信號槽
代碼?例:?本對?,?動換?,縮進,邊距
1)創建四個label, objectName 分別是 label 到 label_4
并且在 QFrame 中設置 frameShape 為 Box (設置邊框之后看起來會更清晰?些)
QFrame 是 QLabel 的?類.其中 frameShape 屬性?來設置邊框性質.
- QFrame::Box :矩形邊框
- QFrame::Panel :帶有可點擊區域的?板邊框
- QFrame::WinPanel :Windows?格的邊框
- QFrame::HLine :?平線邊框
- QFrame::VLine :垂直線邊框
- QFrame::StyledPanel :帶有可點擊區域的?板邊框,但樣式取決于窗?主題
2)編寫widget.cpp,給這四個label設置屬性.
ui->label->setText("這是一段文本");ui->label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->label->setText("這是一段文本");ui->label->setAlignment(Qt::AlignRight | Qt::AlignTop);
自動換行
ui->label_2->setText("這是一段很長的文本這是一段很長的文本這是一段很長的文本這是一段很長的文本這是一段很長的文本這是一段很長的文本這是一段很長的文本");ui->label_2->setWordWrap(true);
//設置縮進ui->label_3->setText("這是一段文本");ui->label_3->setIndent(50);
//設置縮進ui->label_3->setText("這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本");ui->label_3->setIndent(50);ui->label_3->setWordWrap(true);
//設置邊距ui->label_4->setText("這是一段文本");ui->label_4->setMargin(50);
//設置邊距ui->label_4->setText("這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本這是一段文本");ui->label_4->setMargin(50);
代碼?例:設置伙伴
1)創建兩個label和兩個radioButton.
objectName 分別問 label , label_2 , radioButton , radioButton_2
此處把label中的?本設置為"快捷鍵 &A"這樣的形式.
其中&后?跟著的字符,就是快捷鍵.可以通過alt+A的?式來觸發該快捷鍵.
但是注意,這?的快捷鍵和 QPushButton 的不同.需要搭配alt和單個字?的?式才能觸發.
2)編寫widget.cpp,設置buddy屬性
當然這?也可以使?Qt Designer直接設置
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置label和radioButton伙伴關系ui->label->setBuddy(ui->radioButton);ui->label_2->setBuddy(ui->radioButton_2);
}
3)運?程序,可以看到,按下快捷鍵alt+a或者alt+b,即可選中對應的選項.