QList:内存不足

时间:2012-11-26 12:25:55

标签: qt out-of-memory qlist

我有一个用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毫秒执行一次。我已经走了那条路,走向死胡同。这是错误代码。

1 个答案:

答案 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样式表列表,而是应该使一些样式依赖于属性,并设置该属性,然后取消设置样式表然后重新设置它。我相信可以使用unpolishpolish命令完成此操作(请参阅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++;
}