我正在创建一个绘制颜色的程序,然后另一个类检查它们,如果它们匹配则返回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(“...”)之类的东西不会导致程序在按键时崩溃。它仅在前面的函数调用时发生。
答案 0 :(得分:1)
你的程序在这里崩溃了:
br1->color().getRgb(r_ans, g_ans, b_ans);
必须初始化 r_ans
,g_ans
和b_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
。不需要指针和动态内存分配。