qt读取qss文件修改窗口风格时遇到的一个bug

qt5读取qss文件时,加了qDebug输出调试信息会导致设置qss风格失败。但是后面读取到的文件内容没有问题,不知道是什么原因?

第一段代码可以修改窗口风格成功
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file(":/style.qss");
    if(file.exists())
    {
        //qDebug()<<"success open!";
        file.open(QFile::ReadOnly);
        //qDebug()<<QLatin1String(file.readAll());
        QString mystyle = QLatin1String(file.readAll());
        qApp->setStyleSheet(mystyle);
        file.close();
    }
    MainWindow w;
    w.show();

    return a.exec();
}

第二段代码修改窗口风格失败
```c++
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file(":/style.qss");
    if(file.exists())
    {
        qDebug()<<"success open!";
        file.open(QFile::ReadOnly);
        qDebug()<<QLatin1String(file.readAll());
        QString mystyle = QLatin1String(file.readAll());
        qApp->setStyleSheet(mystyle);
        file.close();
    }
    MainWindow w;
    w.show();

    return a.exec();
}




这很可能与 QLatin1String 函数有关。在第一段代码中,您使用了 QLatin1String(file.readAll()) 函数将文件内容转换为 QString 类型的数据,并将其应用于界面风格设置。而在第二段代码中,您两次调用 file.readAll() 函数来读取文件内容,第二次调用时就会发现文件已经被读完,没有数据可以继续提取。

因此,建议您尝试在第二段代码中按照第一段代码的方式只读取一次文件,然后将结果保存在变量中并使用它来设置界面风格,而不是在下一次调用 readAll() 函数时再次读取文件。例如:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file(":/style.qss");
    if(file.exists())
    {
        qDebug()<<"success open!";
        file.open(QFile::ReadOnly);
        QByteArray qssData = file.readAll();  // 仅读取一次文件
        qDebug()<<QLatin1String(qssData);     // 输出读取到的数据
        QString mystyle = QString::fromUtf8(qssData);  // 使用保存的数据来设置界面风格
        qApp->setStyleSheet(mystyle);
        file.close();
    }
    MainWindow w;
    w.show();

    return a.exec();
}

这样,您应该就能在同时输出调试信息和设置界面风格的情况下正常工作了。

最后发现是因为前面调用了一次file.readAll导致文件指针移动到了末尾,后面在执行读文件操作时读出来的是空。与qDebug无关

  • 这篇文章:Qt 日志 QDebug 输出至文件 也许有你想要的答案,你可以看看
  • 除此之外, 这篇博客: 哇,我居然发现qt中的一个小bug中的 原因分析: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 其实我们在对应的ui 的 xml文件中变可以看到问题所在:

    我们把单选按钮,变换后,先enable去掉,在点击上:

    对应的xml文件中,会多了一个属性:

     我们来看groupBox_2中的按钮属性:

    这里并没有enable属性,当我们把groupBox中属性enable去掉:

     对应的xml:

    当我们在界面点击的时候,选中groupBox中enable中,这里的bool 会变成true,但是我们使用代码:

    void MainWindow::on_pushButton_clicked()
    {
        ui->groupBox->setEnabled(true);
    }

         这里的两个单选按钮bool是false,并没有变成true,所以才会出现点击按钮后,两个单选按钮没有亮起来的主要原因,

    这里qt设计有些问题,对一个界面改变,应同时改变group中的其他值。对应我们使用的解决方案后,取消改变后,

    我们看到对应属性都去掉了,又恢复了当初最开始的状态。

        这样的问题不知道你如何想的呢,以此类推的话,其他控件应该也会出现这样的一个小问题,这个也算一个小bug吧,好了就写这里吧,大家可以试试其他相同的问题,让我们一起加油,努力的学习吧,一起共同进步。

        喜欢这个博客的朋友可以关注我的博客,大家一起加油学习一下。