1. QStyle的作用(實(shí)現(xiàn)不同系統(tǒng)下的界面效果的匹配)
Qt 是一個(gè)跨平臺(tái)的類庫(kù),相同的界面組件在不同的操作系統(tǒng)上顯示效果是不一樣的。QStyle是封裝了 GUI 界面組件外觀的抽象類,Qt 定義了 QStyle 類的一些子類,應(yīng)用于不同的操作系統(tǒng)如QWindowsStyle和QMacStyle 等。這些樣式是 QtGUI 模塊自帶的,在不同的平臺(tái)上編譯運(yùn)行的程序具有缺省的樣式,QApplication::style()可以返回應(yīng)用程序缺省的樣式Qt 內(nèi)置的界面組件都使用 QStyle 進(jìn)行繪制,以保證它們與運(yùn)行平臺(tái)的界面效果一致
,如圖16-8 所示是OComboBox在不同操作系統(tǒng)上的九種不同的樣式。
QStyleFactory 類管理著 Qt 的內(nèi)置樣式,QStyleFactory 有兩個(gè)靜態(tài)函數(shù) keys()和 create(),其函數(shù)原型如下:
[static] QStringList QStyleFactory::keys()
[static] QStyle *QStyleFactory::create(const QString &key)
keys()函數(shù)返回一個(gè)字符串列表,是所在平臺(tái)支持的 QStyle 的名稱列表;create()函數(shù)根據(jù)樣式名稱字符串創(chuàng)建一個(gè)QStyle 對(duì)象。
QApplication 有兩個(gè)靜態(tài)函數(shù)用于操作樣式,其函數(shù)原型為:
QStyle *QApplication::style()
void QApplication::setStyle(QStyle *style)
style()函數(shù)返回應(yīng)用程序當(dāng)前的樣式,任何一個(gè) GUI 應(yīng)用程序,在創(chuàng)建時(shí)就有一個(gè)缺省的樣式,通過(guò)下面的語(yǔ)句:
QApplication::style()->metaObject ()->className()
setStyle()為應(yīng)用程序設(shè)置一個(gè)樣式,設(shè)置樣式后,界面元素都具有這個(gè)樣式所定義的外觀。
除了這些 Qt 內(nèi)置的樣式,用戶也可以從 QStyle 類繼承,定義自己的樣式,一般是從 QStyle的子類QProxyStyle 繼承。
2. Qt內(nèi)置樣式的使用
使用 Qt內(nèi)置的樣式,可以通過(guò) QStyleFactory:keys()獲取運(yùn)行平臺(tái)支持的樣式列表,然后用QStyleFactory::create()創(chuàng)建樣式,再用 QApplication::setStyle0)設(shè)置樣式即可。
創(chuàng)建一個(gè)基于QMainWindow 的 Widget 應(yīng)用程序 samp16_2,并設(shè)計(jì)界面。如圖 16-9 所示是設(shè)置為QWindowsStyle樣式時(shí)的運(yùn)行界面,具有老式的 Windows 界面效果。
下面是主窗口構(gòu)造函數(shù)的代碼:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QRegExp regExp(".(.*)\\+?Style");
QString defaultStyle = QApplication::style()->metaObject()->className();
// ui->LabDefaultStyle->setText(defaultStyle);
ui->statusBar->showMessage(defaultStyle);
if (regExp.exactMatch(defaultStyle))
defaultStyle = regExp.cap(1);
ui->comboSysStyle->addItems(QStyleFactory::keys());
ui->comboSysStyle->setCurrentIndex(ui->comboSysStyle->findText(defaultStyle, Qt::MatchContains));
// ui->comboSysStyle->setCurrentIndex(ui.styleSheetCombo->findText("Coffee"));
// loadStyleSheet("Coffee");
}
在構(gòu)造函數(shù)中,通過(guò)QStyleFactory::keys()獲取當(dāng)前平臺(tái)上的樣式名稱列表,并添加到下拉列表框comboSysStyle 里。
程序運(yùn)行后,在“系統(tǒng)樣式”下拉列表框里會(huì)顯示當(dāng)前平臺(tái)支持的樣式列表,例如在 Windows平臺(tái)上,列表里會(huì)有 Widnows、WidnowsXP、WidnowsVista和 Fusion。在“系統(tǒng)樣式”下拉列表框中選擇一個(gè)樣式可以為應(yīng)用程序設(shè)置樣式,下拉列表框comboSysStyle 的currentIndexChanged()信號(hào)響應(yīng)槽函數(shù)代碼如下:
void MainWindow::on_comboSysStyle_currentIndexChanged(const QString &arg1)
{
// qApp->setStyle(arg1);
QStyle *style=QStyleFactory::create(arg1);
qApp->setStyle(style);
ui->statusBar->showMessage(style->metaObject()->className());
}
這里首先使用 QStyleFactory::create(argl)根據(jù)選擇的樣式名稱字符串 argl 創(chuàng)建樣式 style,然后使用qApp->setStyle(style)為應(yīng)用程序設(shè)置樣式。
如果不是需要顯示樣式的類名稱,直接使用qApp->setStyle(arg1)也可以為應(yīng)用程序設(shè)置樣式。
窗口上有“取消樣式表”和“應(yīng)用樣式表”兩個(gè)按鈕,代碼如下:
void MainWindow::on_btnNormal_clicked()
{//正常樣式,去除所有樣式表
this->setStyleSheet("");
}
void MainWindow::on_btnStyleSheet_clicked()
{//設(shè)置樣式表
this->setStyleSheet("QPlainTextEdit{"
"color: blue; "
"font: 13pt '宋體';}"
"QPushButton:hover{background-color:lime;}"
"QLineEdit{ border: 2px groove red;"
"background-color: rgb(170, 255, 127); "
"border-radius: 6px;}"
"QCheckBox:checked{color: red;}"
"QRadioButton:checked{color:red;}"
);
}
“應(yīng)用樣式表”按鈕的代碼為界面上的幾個(gè)顯示組件類設(shè)置了樣式表,在設(shè)置樣式表后,即使修改窗口樣式,這些樣式表定義的顯示效果依然存在。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-635566.html
3. 源碼
3.1 可視化UI設(shè)計(jì)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-635566.html
3.2 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStyleFactory>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QRegExp regExp(".(.*)\\+?Style");
QString defaultStyle = QApplication::style()->metaObject()->className();
// ui->LabDefaultStyle->setText(defaultStyle);
ui->statusBar->showMessage(defaultStyle);
if (regExp.exactMatch(defaultStyle))
defaultStyle = regExp.cap(1);
ui->comboSysStyle->addItems(QStyleFactory::keys());
ui->comboSysStyle->setCurrentIndex(ui->comboSysStyle->findText(defaultStyle, Qt::MatchContains));
// ui->comboSysStyle->setCurrentIndex(ui.styleSheetCombo->findText("Coffee"));
// loadStyleSheet("Coffee");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_comboSysStyle_currentIndexChanged(const QString &arg1)
{
// qApp->setStyle(arg1);
QStyle *style=QStyleFactory::create(arg1);
qApp->setStyle(style);
ui->statusBar->showMessage(style->metaObject()->className());
}
void MainWindow::on_btnNormal_clicked()
{//正常樣式,去除所有樣式表
this->setStyleSheet("");
}
void MainWindow::on_btnFontLarge_clicked()
{//大字體
ui->plainTextEdit->setStyleSheet("font: 13pt '宋體';");
}
void MainWindow::on_btnFontSmall_clicked()
{//小字體
ui->plainTextEdit->setStyleSheet("font: 10pt '宋體';");
}
void MainWindow::on_btnStyleSheet_clicked()
{//設(shè)置樣式表
this->setStyleSheet("QPlainTextEdit{"
"color: blue; "
"font: 13pt '宋體';}"
"QPushButton:hover{background-color:lime;}"
"QLineEdit{ border: 2px groove red;"
"background-color: rgb(170, 255, 127); "
"border-radius: 6px;}"
"QCheckBox:checked{color: red;}"
"QRadioButton:checked{color:red;}"
);
}
到了這里,關(guān)于16-3_Qt 5.9 C++開發(fā)指南_使用QStyle 設(shè)置界面外觀_實(shí)現(xiàn)不同系統(tǒng)下的界面效果的匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!