c++ - 在调试版本上运行在发布版本上失败
问题描述
我尝试Qt 5.12.0
在 linux 平台(Ubuntu 18.04)上使用拖放创建一个简单的应用程序。这儿存在一个问题。
如果我在调试器(gdb)中启动它,它将毫无问题地运行。如果我在没有调试器的情况下启动它并在执行期间附加它,或者只是在没有附加调试器的情况下运行它,它会给我Segmentation fault (core dumped)
错误。以下是源代码:
小部件.h
#ifndef MY_WIDGET_H
#define MY_WIDGET_H
#include <QWidget>
class QMouseEvent;
class QDragEnterEvent;
class QDragMoveEvent;
class QDragLeaveEvent;
class QDropEvent;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
void dragLeaveEvent(QDragLeaveEvent *event) override;
void dropEvent(QDropEvent *event) override;
};
#endif
小部件.cpp
#include "widget.h"
#include <QMimeData>
#include <QDrag>
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QDragLeaveEvent>
#include <QDragMoveEvent>
#include <QLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setAutoFillBackground(true);
setLayout(new QVBoxLayout());
setAcceptDrops(true);
setMinimumSize(50, 50);
}
void Widget::mousePressEvent(QMouseEvent *event)
{
QMimeData *mime = new QMimeData();
QDrag *drag = new QDrag(this);
drag->setMimeData(mime);
this->hide();
drag->exec(Qt::MoveAction);
this->show();
}
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
event->accept();
}
void Widget::dragLeaveEvent(QDragLeaveEvent *event)
{
event->accept();
}
void Widget::dragMoveEvent(QDragMoveEvent *event)
{
event->accept();
}
void Widget::dropEvent(QDropEvent *event)
{
event->setDropAction(Qt::MoveAction);
event->accept();
QWidget *widget = qobject_cast<QWidget *>(event->source());
layout()->addWidget(widget);
}
主文件
#include <QApplication>
#include "widget.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Widget wdg1;
Widget wdg2;
wdg1.show();
wdg2.show();
QPalette pal;
pal.setColor(QPalette::Background, Qt::red);
wdg1.setPalette(pal);
pal.setColor(QPalette::Background, Qt::blue);
wdg2.setPalette(pal);
return app.exec();
}
proj.pro
######################################################################
# Automatically generated by qmake (3.1) Wed Feb 27 12:57:15 2019
######################################################################
TEMPLATE = app
TARGET = proj
INCLUDEPATH += .
# The following define makes your compiler warn you if you use any
# feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Input
HEADERS += widget.h
SOURCES += main.cpp widget.cpp
QT += core gui widgets
执行后将一个小部件拖放到另一个小部件上以重现错误。
在类似的项目中,我遇到了同样的错误,这是从
#0 0x00007ffff6f764f2 in QCoreApplication::postEvent(QObject*, QEvent*, int) (receiver=receiver@entry=0x555555a42d30, event=event@entry=0x555555a42f50, priority=priority@entry=0) at kernel/qcoreapplication.cpp:1503
#1 0x00007ffff5f13ec7 in QBasicDrag::eventFilter(QObject*, QEvent*) (this=<optimized out>, o=0x555555a42d30, e=0x7fffffffca80) at kernel/qsimpledrag.cpp:187
#2 0x00007ffff7ec42b9 in QXcbDrag::eventFilter(QObject*, QEvent*) (this=<optimized out>, o=<optimized out>, e=<optimized out>) at qxcbdrag.cpp:170
#3 0x00007ffff6f6f8ac in QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject*, QEvent*) (this=this@entry=0x5555557721d0, receiver=receiver@entry=0x555555a42d30, event=event@entry=0x7fffffffca80)
at kernel/qcoreapplication.cpp:1168
#4 0x00007ffff742feac in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=this@entry=0x5555557721d0, receiver=receiver@entry=0x555555a42d30, e=e@entry=0x7fffffffca80) at kernel/qapplication.cpp:3705
#5 0x00007ffff7437590 in QApplication::notify(QObject*, QEvent*) (this=0x7fffffffdc30, receiver=0x555555a42d30, e=0x7fffffffca80)
at kernel/qapplication.cpp:3093
#6 0x00007ffff6f6fbe3 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x555555a42d30, event=0x7fffffffca80)
at kernel/qcoreapplication.cpp:1060
#7 0x00007ffff6f6fe64 in QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) (receiver=receiver@entry=0x555555a42d30, event=event@entry=0x7fffffffca80)
at kernel/qcoreapplication.cpp:1462
有人可以帮我理解这个问题吗?
解决方案
推荐阅读
- python - 如何更改用户 vc 权限以管理频道 [discord.py]
- javascript - 导航返回后保留参数的正确方法是什么?
- reactjs - 无效的挂钩调用。使用 useDispatch 时,只能在函数组件的主体内部调用 Hooks
- vb.net - 如何将日期时间转换为秒 vb.net
- angular - 如何将 api 返回的数据转换为 Angular 中的 json?
- r - 如何在条形图中的误差条和条形之间进行颜色叠加?
- dictionary - 将地图的条目分组到列表中
- laravel - Laravel 8:为了让 SPA 永远不会出现 419 错误,使用 Sanctum 并将路由放在 api 路由中是否合适?
- php - 教义:将枚举类定义为实体的columDefinition
- flutter - 颤振升级不适用于提供不正确网址的 vs 代码?