在keyPressEvent上崩溃

时间:2014-11-18 00:02:23

标签: c++ qt

我正在创建一个绘制颜色的程序,然后另一个类检查它们,如果它们匹配则返回true。整个代码在对话框中。 colQ是一个只存储RGB值和其他东西的类;我们将使用这些来获取RGB。

colDialog::colDialog(QWidget *parent) // etc..
{
  // initialization code

    colQ.setColor(255, 0, 0); // red
    r_ans = g_ans = b_ans = nullptr;
}

然后我有一个绘制事件来完成绘图。 r1和br1是各自类别的指针。

void Atn_QDialog::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);

    r1 = new QRect(100, 100, 175, 400);
    br1 = new QBrush(QColor(colQ.getR, colQ.getG, colQ.getB));
    painter.fillRect(*r1, *br1);
    painter.drawRect(*r1);

    // other color code
}

此时,我会画一个红色的矩形。我现在要做的是让用户按一个键(如1),然后colQ将检查存储的颜色是否与按下该键的矩形上的颜色匹配。

void colDialog::keyPressEvent(QKeyEvent *Ev)
{
    if (Ev->key() == Qt::Key_1)
    {
         br1->color().getRgb(r_ans, g_ans, b_ans);
         colQ.answer(*r_ans, *g_ans, *b_ans);

         if (colQ.isCorrect())
              ui->resultlabel->setText("correct!");
         else ui->resultlabel->setText("wrong!"); 
    }

    // other key presses here
    QDialog::keyPressEvent(Ev);
}

当我按下代码到目前为止执行的“1”键时,会发生错误。之前,按下键会很好地响应,但是在运行此代码时它不会响应。 Fyi,colQ没有Qt代码,并且省略其代码仍然导致我的程序崩溃。我在这里做的是我希望将颜色存储在QBrush *类型的br中。我将指针传递给getRgb(..),因为这就是要求的。代码在keyPressEvent(Ev)上有效崩溃;诸如ui> resultlabel-~> setText(“...”)之类的东西不会导致程序在按键时崩溃。它仅在前面的函数调用时发生。

1 个答案:

答案 0 :(得分:1)

你的程序在这里崩溃了:

br1->color().getRgb(r_ans, g_ans, b_ans);
必须初始化

r_ansg_ansb_ans,并且必须为这些指针分配内存。 QColor::getRgb没有为您分配内存,它只会更改值,因此会因分段错误/访问冲突而崩溃。

在构造函数内部为这3个指针分配内存:

colDialog::colDialog(QWidget *parent) // etc..
{
  // initialization code

    colQ.setColor(255, 0, 0); // red
    r_ans = new int;
    g_ans = new int;
    b_ans = new int;
}

如果你有一个nullptr并尝试取消引用它:int *p = nullptr; int x = *p;程序将崩溃。这就是QColor::getRgb内部发生的事情:取消引用3个指针以更改它们指向的值,因此应用程序崩溃。

你做的事情也很可怕:

r1 = new QRect(100, 100, 175, 400);
br1 = new QBrush(QColor(colQ.getR, colQ.getG, colQ.getB));

paintEvent内。即使您在paintEvent功能的某处释放内存,也不是一件坏事。在堆栈上声明r1并在构造函数中初始化它,你不需要这里的指针。此外,还要在堆栈上创建br1。不需要指针和动态内存分配。