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

发布于:2025-03-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

概要

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