文章目錄
- 概要
- 插件實現界面
- 核心代碼
- 設置樣式
- 擴展
- 導入樣式
- 導出樣式
概要
最近需要設計界面,但是使用Qt的Designer只能看到每個界面單獨的樣式,程序中有些事需要主界面調用進行組合的界面,因此需要寫一個插件Ui可以直接輸入樣式內容,進行實時設置,查看樣式效果。
插件實現界面
- 應用樣式前
- 應用樣式后
核心代碼
設置樣式
void SetSheetStyle::on_pbtn_Apply_clicked()
{qApp->setStyleSheet(ui->pte_SheetStyle->toPlainText());qApp->style()->unpolish(qApp); qApp->style()->polish(qApp);
}
詳解:
設置樣式代碼為:A->setStyleSheet(ui->pte_SheetStyle->toPlainText());
如果為程序全局設置則A為qApp;
如果為特定的Ui控件設置則A為控件名。注意:
當程序已經設置了樣式之后,再次設置樣式必須添加
qApp->style()->unpolish(qApp);
qApp->style()->polish(qApp);
這兩行代碼,因為給qApp設置樣式前,需要卸載當前樣式,之后安裝樣式才能生效
擴展
我上面的實現里面添加了導入外部的樣式表和將當前樣式表導出為qss文件的功能,如需,可以添加。
導入樣式
void SetSheetStyle::on_pbtn_importQss_clicked()
{// 1. 獲取打開路徑QString path = QCoreApplication::applicationDirPath();QString fileName = QFileDialog::getOpenFileName(nullptr, // 父窗口"打開文件", // 對話框標題path, // 默認目錄"文本文件 (*.txt);;所有文件 (*)" // 文件過濾器);// 檢查用戶是否取消了對話框if (fileName.isEmpty()) {QMessageBox::warning(nullptr, "警告", "未選擇文件路徑!");return;}// 2. 創建并打開文件QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {QMessageBox::critical(nullptr, "錯誤", "無法打開文件:" + file.errorString());return;}// 3. 讀取內容QTextStream in(&file);QString str = in.readAll();// 4. 關閉文件(QFile析構時會自動關閉,但顯式關閉更好)file.close();// 5. 顯示到文本框ui->pte_SheetStyle->setPlainText(str);}
導出樣式
void SetSheetStyle::on_pbtn_ExportQss_clicked()
{ // 1. 獲取保存路徑QString path = QCoreApplication::applicationDirPath();QString fileName = QFileDialog::getSaveFileName(nullptr, // 父窗口"保存文件", // 對話框標題path, // 默認目錄"文本文件 (*.txt);;所有文件 (*)" // 文件過濾器);// 檢查用戶是否取消了對話框if (fileName.isEmpty()) {QMessageBox::warning(nullptr, "警告", "未選擇文件路徑!");return;}// 2. 創建并打開文件QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::critical(nullptr, "錯誤", "無法創建文件:" + file.errorString());return;}// 3. 寫入內容/*QTextStream out(&file);out << str.data();*/QString str = ui->pte_SheetStyle->toPlainText();const char* data = str.toStdString().c_str();file.write(data);// 4. 關閉文件(QFile析構時會自動關閉,但顯式關閉更好)file.close();// 可選:提示成功QMessageBox::information(nullptr, "成功", "文件已保存至:" + fileName);
}