Qt CSS的错误处理

1 投票
1 回答
609 浏览
提问于 2025-04-17 11:07

我有一个应用程序,它会根据用户的输入生成自己的样式表。用户可以选择不同的背景颜色或图片来改变每个小部件的外观。

每次我开始使用这个功能时,一切都运行得很好。但是,过了一段时间后,程序就会变得很慢,窗口上没有任何视觉变化,尽管样式表还在不断添加和应用。

因为在生成CSS时涉及到一些复杂的字符串处理,我猜可能是CSS中出现了错误,导致Qt无法正确解析所有内容。

我找不到这个错误!我的CSS始终是这样的格式:

"#widget { 'correctly formatted properties';} #nextwidget..."

我知道(通过算法的限制和检查损坏的CSS文件)每个小部件的属性在语法上都是正确的。

不过,我注意到这样做...

#widget {color: ;}

...并不会阻止Qt解析其余的字符串,但使用一些不存在的属性(比如 { goose: 2 })就会导致问题。

那么,Qt会忽略哪些类型的错误,又是什么导致它停止解析文件的其余部分呢?我在Qt的文档中找不到相关的列表或信息。
(实际上,PyQt4包中甚至没有样式表的文档。)

在我的CSS中,我对用户选择的每个小部件都应用...

 {color: x; background-image:, y, background-color: z }   

(x、y、z是正确的替代值)。
有没有一些可见的小部件不支持这些属性?
(这可能是我问题的根源!)


我尝试把样式表放入一个验证器中,这里有两个导致错误的CSS片段,我不知道为什么会出错!

#centralwidget { color: #ffffff ;
                background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #aaff00, stop: 1 #aac300)  
                }

还有...

#Display { background-image: url('+NewTextureFile+');
         background-repeat: repeat-xy; 
         }

如果有人能帮我解决这些问题,我会非常感激!
(我想大家都能看出来,我一直在努力学习CSS...)

编辑: @ Avaris:

抱歉,这段损坏的CSS不是最小化的;我不知道哪部分出错了!

我怀疑是因为我没有用';'结束所有属性。

#tab{color: #000000 ;background-color: #ff0000    } #tab{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Penguins.jpg);background-repeat: repeat-xy;    } #Amount_Unit{color: #000000 ;background-color: #aaff00   } #Conc_Unit2{color: #000000 ;background-color: #aaff00   } #pushButton{color: #000000 ;background-color: #aaff00   } #tab_2{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Penguins.jpg);background-repeat: repeat-xy;  } #RMM_Output{color: #000000 ;background-color: #aaff00  } #Conc_Unit1{color: #000000 ;background-color: #aaff00  } #UnitText{color: #000000 ;;  } #Amount_Input{color: #000000 ;;  } #Concentration_Input{color: #000000 ;;  } #Amount_Output{color: #000000 ;;  } #Subshell_Element{color: #000000 ;background-color: #00aaff  } #Charge{color: #000000 ;background-color: #00aaff  } #Simple_Config{color: #000000 ;background-color: #00aaff  } #Actual_Config{color: #000000 ;background-color: #00aaff  } #Save_Simple_Button{color: #ffffff ;background-color: #aaff00  } #Save_Actual_Button{color: #ffffff ;background-color: #aaff00  } #pushButton_2{color: #ffffff ;background-color: #aaff00  } #centralwidget{color: #ffffff ;background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #aaff00, stop: 1 #aac300)  } #pushButton_3{color: #000000 ;background-color: #ff0000  } #Calculate_Proportions_Button{color: #000000 ;background-color: #f80000  } #{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Koala.jpg);background-repeat: repeat-xy;  } #tab_4{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Koala.jpg);background-repeat: repeat-xy;  }  #LayoutContainer1{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Koala.jpg);background-repeat: repeat-xy;  } #AmountInput{color: #ffaa00 ;background-color: #ffff00  } #tab_5{color: #000000 ;background-color: #ffffff  } #menubar{color: #000000 ;background-color: #ffffff  } #tabWidget{color: #000000 ;background-color: #ffffff  } #Reaction_Element_Holder{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Penguins.jpg);background-repeat: repeat-xy; } 

谢谢你的阅读!


PyQt4
python 2.7.2
Windows 7

1 个回答

3

看这个例子中的CSS,有一个没有名字的ID选择器:

#tab{color: #000000 ;background-color: #ff0000    } 
/* ... */
#{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Koala.jpg);background-repeat: repeat-xy;  } #
/* ... */
#Reaction_Element_Holder{color: #000000 ;background-image: url(E:/ChemCalc ULTIMATE/ChemCalc ULTIMATE/Texture Files/Penguins.jpg);background-repeat: repeat-xy; }

这个选择器让解析器崩溃了,导致后面的CSS都变得无效。

顺便提一下,没有名字的ID选择器其实是无效的CSS。W3C验证工具会给出:

Parse Error  Lexical error at line 1, column 2. Encountered: "{" (123), after : "#"

对于:

#{ color: blue; }
body { color: red; }

不过我测试过的浏览器(比如Opera和Firefox)足够聪明,可以忽略这个错误并继续运行。显然,Qt的CSS解析器对这种错误就不太能接受了。

撰写回答