c++ - Qt5自定义LineEdit小部件(QLineEdit子类)私有(private)变量崩溃应用

标签 c++ qt qt5 qlineedit

我创建了一个自定义 QLineEdit 小部件来处理文件的拖放。该部分一切正常,但只要我添加一个类变量,应用程序就会在类的构造或销毁时崩溃:

  • 当我的变量是 QString 时,它在构造时崩溃
  • 当我的变量是 QString* 时,它在销毁时崩溃了

我尝试在析构函数中删除变量 (QString*),同样的问题...

有什么想法吗?

标题:

#ifndef DROPLINEEDIT_H
#define DROPLINEEDIT_H

#include <QLineEdit>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFileInfo>
#include <QString>
#include <QDebug>


class DropLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit DropLineEdit(QWidget *parent = 0);
    ~DropLineEdit();

protected:
    virtual void dragEnterEvent(QDragEnterEvent *event);
    virtual void dropEvent(QDropEvent *event);
    virtual void dragLeaveEvent(QDragLeaveEvent *event);

signals:

public slots:

private:

    QString * mFileName;

};

#endif // DROPLINEEDIT_H

来源:

#include "droplineedit.h"

DropLineEdit::DropLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
    setAcceptDrops(true);
    this->setReadOnly(true);
    this->setStyleSheet("QLineEdit { border: 2px solid gray ; border-radius: 8px ; padding: 0 6px }");
}

DropLineEdit::~DropLineEdit()
{
    if(!mFileName){
        delete mFileName;
    }
}

// **************************************** PROTECTED METHODS **************************************** //

void DropLineEdit::dragEnterEvent(QDragEnterEvent *event){
    this->setStyleSheet("QLineEdit { border: 3px solid black ; border-radius: 8px ; padding: 0 6px }");
    event->accept();
}
void DropLineEdit::dragLeaveEvent(QDragLeaveEvent *event){
    this->setStyleSheet("QLineEdit { border: 2px solid gray ; border-radius: 8px ; padding: 0 6px }");
    event->accept();
}

void DropLineEdit::dropEvent(QDropEvent *event){
    // Get the data. If multiple files are dropped, take only the first one and fetch save its info
    QList<QUrl> list = event->mimeData()->urls();
    QFileInfo * fileInfo = new QFileInfo(list.at(0).toLocalFile());

    qDebug() << fileInfo->absoluteFilePath();
    mFileName = new QString(fileInfo->absoluteFilePath());

    this->setText(fileInfo->fileName());
    this->setStyleSheet("QLineEdit { border: 2px solid gray ; border-radius: 8px ; padding: 0 6px }");
    event->accept();
}

最佳答案

将其添加到构造函数中:

mFileName = 0;

您需要初始化指针。否则它将具有随机值,您将无法检查您是否创建了一个对象。

修改析构函数:

delete mFileName;

如果对象不是 NULL,则需要删除对象(您的版本恰恰相反)。 delete 将在内部执行检查。

请注意,如果多次执行mFileName = new QString...,将创建​​多个对象。如果您需要避免内存泄漏,您需要在创建新对象之前删除之前的对象。

但是,以上所有信息都是为​​通识教育提供的。你不应该在这里使用 QString*。非指针 QString 类成员会更正确。在这种情况下你不需要使用newdelete,你根本不需要关心指针和内存。

关于c++ - Qt5自定义LineEdit小部件(QLineEdit子类)私有(private)变量崩溃应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17373591/

相关文章:

c++ - 如何在我不想编辑的第 3 方代码中禁用来自 gcc 的未使用变量警告?

c++ - 用固定数字池中的随机唯一整数填充 vector

Qt信号槽连接——QNetworkAccessManager

c++ - 如何在QTabWidget标题中设置QWidget?

c++ - Qt Creator, ptrace : Operation not permitted. 永久解决方案是什么?

c# - 尝试读取或写入 protected 内存。导入到 C# 的 C++ dll

c++ - Eigen - 排序矩阵对角线

cocoa - 在 Qt 中订阅 Apple 事件

python - PyQt、QComboBox 和 QStringModel 导致 QObject::startTimer: QTimer 只能与以 QThread 启动的线程一起使用

android - QWidget-based Android style preview in designer?