在keyPressEvent上崩溃

Crash on keyPressEvent

本文关键字:崩溃 keyPressEvent      更新时间:2023-10-16

我正在创建一个绘制颜色的程序,然后另一个类检查它们并在它们匹配时返回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"键时,就会发生此错误。以前,按键响应正常,但在运行此代码时则不然。仅供参考,colQ 没有 Qt 代码,省略其代码仍然会导致我的程序崩溃。我在这里做的是我想将颜色存储在 QBrush* 类型的 br 中。我将指针传递给getRgb(..),因为这是所要求的。代码在keyPressEvent(Ev)上有效崩溃;像 ui->resultlabel-~>setText("...") 这样的东西不会导致程序在按键时崩溃。它仅在上述函数调用中发生。

您的程序在此处崩溃:

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。不需要指针和动态内存分配。