概要
最近需要设计界面,但是使用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);
}