在keyPressEvent上崩溃
Crash on keyPressEvent
我正在创建一个绘制颜色的程序,然后另一个类检查它们并在它们匹配时返回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_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
。不需要指针和动态内存分配。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 在keyPressEvent上崩溃