我有一个用Qt编写的用于嵌入式Linux的图形应用程序。此应用程序的一部分是每250毫秒更新一次显示屏幕。但是,大约8到10个小时后,应用程序崩溃了一个" QList:内存不足"错误。我已经隔离了它发生的功能和线条(在某种意义上),但我不知道它为什么会发生,因为我没有使用QList。此函数中唯一有效的代码行位于此问题的最后。
我意识到QList并没有“缩小”。它用于保存项目的内存,但我没有在我的代码中的任何地方使用QList。我只是在调用“setStyleSheet'在ui小部件(标签,文本字段等)上设置各种字体和属性还有更多代码,但是所有代码都被注释掉了,所以我假设它与setStyleSheet有关。有谁知道为什么会这样?如果是这样,你知道解决这个问题吗?我正在使用Q.t. 4.3 btw(由于它是专门加载到我使用的嵌入式系统上)。
非常感谢你的时间。
if(twc_rx){
ui->label_Rx->setStyleSheet("QLabel { background-color: lime; font: bold 16px 'Arial' }");
}else if(!twc_rx){
ui->label_Rx->setStyleSheet("QLabel { background-color: grey; font: bold 16px 'Arial' }");
}//line 561 to 684
if(twc_tx){
ui->label_Tx->setStyleSheet("QLabel { background-color: lime; font: bold 16px 'Arial' }");
}else{
ui->label_Tx->setStyleSheet("QLabel { background-color: grey; font: bold 16px 'Arial' }");
}if(ats_stat){
ui->label_ATS->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_ATS->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
if(atp_stat){
ui->label_atp2->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_atp2->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
if(ato_stat){
ui->label_ATO->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_ATO->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
编辑:
我应该提到这些行是基于来自另一个子系统的输入消息每250毫秒执行一次。我已经走了那条路,走向死胡同。这是错误代码。
答案 0 :(得分:2)
使用qstylesheets的方式更多是静态属性。如果您打算动态更改属性,我会调查Customizing Using Dynamic Properties。
使用动态属性自定义
在很多情况下我们需要提供一个表格 必须填写。要向用户表明该字段是强制性的, 一个有效的(虽然美学上可疑)解决方案是使用黄色 作为这些字段的背景颜色。事实证明这是非常的 使用Qt样式表易于实现。首先,我们会使用 遵循应用程序范围的样式表:
*[mandatoryField="true"] { background-color: yellow }
这意味着每个小部件都设置了mandatoryField Qt属性 如果是真的将有一个黄色背景。
然后,对于每个必填字段小部件,我们只需创建一个 mandatoryField属性,并将其设置为true。例如:
QLineEdit *nameEdit = new QLineEdit(this); nameEdit->setProperty("mandatoryField", true); QLineEdit *emailEdit = new QLineEdit(this); emailEdit->setProperty("mandatoryField", true); QSpinBox *ageSpinBox = new QSpinBox(this); ageSpinBox->setProperty("mandatoryField", true);
频繁交换值似乎更友好。这在Qt 4.7中得到了很好的解释,但它似乎仍然可以在Qt 4.3中使用:The Style Sheet Syntax: Selector Types
基本上,不是一遍又一遍地添加为你的应用程序设置的q样式表列表,而是应该使一些样式依赖于属性,并设置该属性,然后取消设置样式表然后重新设置它。我相信可以使用unpolish
和polish
命令完成此操作(请参阅Styles and Style Aware Widgets)。
编辑:以下是使用此技术的示例。有一个带有QPushButton的mainwindow.ui。
的main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimerEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void timerEvent(QTimerEvent *);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString stylesheet =
"*[mandatoryField=\"true\"] { background-color: yellow }"
"*[mandatoryField=\"false\"] { background-color: gray }"
"QPushButton[otherField=\"true\"] { border: none; }"
"QPushButton[otherField=\"false\"] { border-color: navy; }";
ui->pushButton->setProperty("mandatoryField", true);
ui->pushButton->setProperty("otherField", true);
ui->pushButton->setStyleSheet(stylesheet);
this->startTimer(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::timerEvent(QTimerEvent *)
{
static int count = 0;
if(count % 2)
{
bool previousMandatoryFieldValue = ui->pushButton->property("mandatoryField").toBool();
ui->pushButton->setProperty("mandatoryField", !previousMandatoryFieldValue);
qDebug() << "mf" << previousMandatoryFieldValue;
}
else
{
bool previousOtherFieldValue = ui->pushButton->property("otherField").toBool();
ui->pushButton->setProperty("otherField", !previousOtherFieldValue);
qDebug() << "of" << previousOtherFieldValue;
}
ui->pushButton->style()->unpolish(ui->pushButton);
ui->pushButton->style()->polish(ui->pushButton);
this->update();
count++;
}