gpt4 book ai didi

c++ - 在 keyPressEvent 上崩溃

转载 作者:行者123 更新时间:2023-11-28 06:34:20 24 4
gpt4 key购买 nike

我正在创建一个绘制颜色的程序,然后另一个类检查它们并在它们匹配时返回 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。不需要指针和动态内存分配。

关于c++ - 在 keyPressEvent 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26984281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com