当前位置: 首页 > article >正文

Qt动态设置样式,实现样式实时切换

文章目录

    • 概要
      • 插件实现界面
    • 核心代码
      • 设置样式
    • 扩展
      • 导入样式
      • 导出样式

概要

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

http://www.kler.cn/a/596291.html

相关文章:

  • 项目实战:基于瑞萨RA6M5构建多节点OTA升级-创建工程MCUBoot<二>
  • 【CMake指南】第10篇:复杂项目重构与优化指南(实战)
  • CUDAOpenCV 基于Hessian矩阵计算特征值
  • Rust vs. Go: 在使用最快框架时的性能测试[译]
  • 界面控件DevExpress WPF v25.1预览 - .NET开发效率提升
  • java 数据库连接基于向驱动管理器注册第三方驱动的机制介绍,包含三种注册类型和华为高斯(GaussDB)数据库的完整连接例子
  • 【Node.js入门笔记9---path 模块】
  • PHP函数与数据处理
  • 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨
  • Oracle 常用语法汇总
  • pytest的测试报告allure
  • Vue3:构建高效用户界面的利器
  • OpenSSL 3.0.2 报 dh key too small 的问题
  • [AI建模] 使用Pinokio本地化部署混元2D到3D AI建模服务
  • [极客大挑战 2019]Knife——3.20BUUCTF练习day4(2)
  • 田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)
  • 如何在 Flutter 中使用 WebRTC
  • Linux系统中安装各种常用中间件
  • 在QT中进行控件提升操作
  • gitlab-ci.yml文件详解