QT QSS,QML 樣式學習


QT QSS,QML 樣式學習

簡介

通過QT的QSS和QML定制QT的樣式

參考鏈接

https://www.jianshu.com/p/2c7db2f6c458

https://www.cnblogs.com/bclshuai/p/9809679.html 有很多方法

使用方法

  1. 在Qt Designer中設置stylesheet
  2. 在代碼中調用控制的stylesheet()接口來設置樣式
  3. 將QSS內容保存到文件中,通過代碼讀取該文件內容。
void MainWindow::load_style_sheet(const QString &fileName)
{
    QFile file(fileName);
    if(file.open(QFile::ReadOnly)) {
        qApp->setStyleSheet(file.readAll());
        file.close();
    }
}
  1. 使用命令行參數"-stylesheet"來指定要加載的QSS文件

./QtDemo -stylesheet test.qss

簡單預覽

在qtCreater里面使用Ctrl+R來預覽

關鍵css

border-image:url();  // 設置背景圖片
QMenu{}; // 作為父類設置
QMenu::item; // 對每一個元素進行設置
QMenu::item:selected; // 元素選中的樣式設置
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                             stop: 0 rgb(45,133,207),
                             stop: 1.0 rgb(125,195,250));// x 坐標不變y坐標變化,顏色從0的顏色漸變到1的顏色
QMenu::item:disabled; // 元素設定為不能使用的顏色
QScrollBar; // 滑動條
QScrollBar:horizontal; // 水平滑動條
QScrollBar::handle:horizontal;// 設定滑塊
QScrollBar::add-line:horizontal; // 下箭頭的設定
    subcontrol-position: right; // css沒有的控制規范 可以對空間中的元素進行控制
    subcontrol-origin: margin;
QScrollBar::sub-line:horizontal; // 上箭頭的設定 奇怪
QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal;// 箭頭
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal; // 滑塊未划過的區域 和 滑塊划過的區域
QScrollBar:vertical; // 垂直滑動條
QScrollBar::handle:vertical;
QScrollBar::add-line:vertical;QScrollBar::sub-line:vertical;
QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical;
QTabBar::tab;// 書簽分頁器
QTabWidget::pane;// 玻璃片應該就是每個分頁的設置
QTabBar::tab:last; // 最有一個tab的設置
border-top-right-radius: 3px;// 就設置上和右的邊框寬度
QTabBar::tab:first:!selected; // 未選中的標簽
QTabBar::tab:!selected;// 未選中的標簽
QTabBar::tab:selected; // 選中的標簽
QTabBar::tab:!selected:hover; // 沒選中的標簽然后鼠標浮現在其上方的樣式
QListWidget::Item; // 列表中的每個元素
QListWidget::Item:hover; // 列表中的元素鼠標浮在上方
QListWidget::Item:selected; // 元素選中的樣式
QLineEdit; // 行編輯器
QLineEdit:focus; // 獲得焦點
QPushButton; // 按鈕的樣式
QPushButton:hover; // --
QPushButton:pressed; // --
QTextEdit;
QTextEdit:hover;
QTextEdit:focus;
QComboBox; // 組合框
QComboBox::drop-down; // 組合框右邊的按鈕
QComboBox QAbstractItemView; // QAbstractItemView; 對類似下拉框的操作
QDialog; // 對話框的樣式

各種效果的實現

設置邊框的大小

不知道為什么設置為

width:xxx;
height:xxx; 起不了效果

采用

	min-width:612px;
	max-width:612px;
	min-height:680px;
	max-height:680px;

設置邊框邊角的弧度

border-radius: 12px;

當然你可以分別設置其他方向的弧度例如

border-top-left-radius:2em;

設置背景圖片

可以設置為資源文件夾qrc里面的東西

background:url(':/clothTexture/Resources/83.png');

只設置下邊框

border: none;
border-bottom: 2px solid #999999;

設置label顯示密碼形式

lineedit-password-character: 1000;

其中代碼設置

ui->password->setEchoMode(QLineEdit::Password);

設置checkbox的勾選框顏色

QCheckBox::indicator{
    width: 24px;
    height: 24px;
    border: 1px solid #AC9472;
}

設置checkbox勾選后展示的背景圖片

QCheckBox::indicator:checked {
    image: url(:/clothTexture/Resources/68.png);
    border: 1px solid #AC9472;
}

設置字體

因為 PingFang-SC 字體要自己下載,沒有在QSS里面找到函數接口,寫代碼實現

	ui->setupUi(this);
	QFontDatabase fontDatabase;
	int result = fontDatabase.addApplicationFont("D:/code/clothTexture/clothTexture/Resources/PingFang-SC-Regular.ttf");
	QString  stringFont = QFontDatabase::applicationFontFamilies(result).at(0);
	QFont font(stringFont);
	//QGuiApplication::setFont(font);
	ui->XXX->setFont(font);

設置沒有app標頭的效果

setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground);
ui->setupUi(this);

展現出dialog的邊角弧度

將視覺組件用Frame包裹,然后設定Frame的顯示效果。

TIPS

  • 對象的objectName就是QSS中的id

menubar

menubar 的效果一直做不出來打算嘗試更新QT到最新版本 5.15 嘗試學習qml

qml

link:

https://wiki.qt.io/QtDesignStudio

https://doc.qt.io/qt-5/qmlapplications.html

https://doc.qt.io/qt-5/qtdoc-tutorials-alarms-example.html

Qt Quick & qml

https://blog.csdn.net/qq_22122811/article/details/78163754 (CSDN博客講的很詳細)

使用QML 和C++ 混合編程 https://blog.csdn.net/foruok/article/details/32698603

簡單總結

QTCSS 不是特別難,但是,不想前端那樣所見即所得,如果在virtual studio中進行樣式更改,每次更改需要重新編譯運行才能改到新的樣式。在QT Designer里面可以簡單看到預覽樣式。

后續的修改,可能qt widget不能能夠設定為很完美的效果。最新的qt開發者協會推薦使用qml來實現定制化。也簡單查看了網易雲音樂和迅雷的產品架構。

網易雲音樂PC版本采用的是

雲音樂和釘釘可以確定是CEF3框架+html UI,說的通俗一點就是包裝了一個瀏覽器,里面顯示的還是html元素,網易很多應用這方面做的比較成熟了,把CEF3框架(開源的)拿來定制的比較深,一般用戶幾乎看不出他們用的PC端實際上還是類Web應用;微信新版不知道,之前的應該還是傳統的Direct UI應用。(利益相關,chromium內核瀏覽器開發。)

作者:balloon
鏈接:https://www.zhihu.com/question/50128701/answer/139653191
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

迅雷采用的是

之前扒過飛書的源碼,從代碼設計架構層面里里外外學習一把,飛書還是挺“大方”的,源碼在客戶端和網頁端都一覽無余,不過好像新版本已經看不到了。相關的文章由於在內網技術論壇發過了不便於再發出來(泄露內部資料會被查水表的),因此這次周末抽時間換一個鳥窩來掏一掏。一不小心發現迅雷的客戶端竟然也是基於 Electron 開發的,那代碼就好扒拉了。(先吐槽一下這新版本的某lei為什么要抄釘釘的界面,這些年某lei都不知道自己要干什么了,每個版本都招人嫌)。

作者:終端研發部
鏈接:https://zhuanlan.zhihu.com/p/337048581
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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