Qt索引属性返回负数

时间:2018-12-18 12:18:35

标签: c++ qt

我很茫然。我有一个类对象,我在其中将属性设置为int值。但是,当我查看该值或尝试通过代码检索它时,它将返回一个巨大的负数。为什么会这样?

enter image description here

然后我根据列表中字符串位置的索引设置实际值,如下所示:

-1163005939

MyObject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <QString>

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = nullptr);
    MyObject(const QString &title, QObject *parent = nullptr);

    QString title;
    QString getTitle() const;
    void setTitle(const QString &value);

    int index;
    int getIndex() const;
    void setIndex(const int &value);

signals:

public slots:

private:
};

#endif // MYOBJECT_H

MyObject.cpp

#include "myobject.h"

MyObject::MyObject(QObject *parent) : QObject(parent)
{

}

MyObject::MyObject(const QString &title, QObject *parent) : QObject(parent)
{
    setTitle(title);
}

QString MyObject::getTitle() const
{
    return title;
}

void MyObject::setTitle(const QString &value)
{
    title = value;
}

int MyObject::getIndex() const
{
    return index;
}

void MyObject::setIndex(const int &value)
{
    index = value;
}

Main.cpp

#include <QCoreApplication>
#include "myobject.h"
#include <QList>
#include <QStringList>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // Create a list of objects
    const QStringList names{"Kevin","Amy","Michelle","John"};

    QList<MyObject> objects;
    for (int i = 0; i < names.size(); i++) {
        MyObject obj = new MyObject(names[i]);
        // MyObject obj(names[i]);
        obj.setIndex(i);
    }

    // Sort Alphabetically
    std::sort(objects.begin(), objects.end(), [](const MyObject& a, const MyObject& b) -> bool { return a.getTitle() < b.getTitle(); });
    // Then Sort By Index
    std::sort(objects.begin(), objects.end(), [](const MyObject& a, const MyObject& b) -> bool { return a.getIndex() < b.getIndex(); });

    // Print info
    for (int i=0; i < objects.size(); i++) {
        qDebug() << objects[i].getIndex();
        qDebug() << objects[i].getTitle();
    }

    return a.exec();
}

1 个答案:

答案 0 :(得分:1)

您的示例代码遇到许多问题,但是有足够的地方(我认为)可以查看您要执行的操作。

首先,所示代码实际上并未向MyObject变量中添加任何QList<MyObject>实例,并且-基于某些注释掉的代码-您已经遇到了最大的问题:{ {1}}是不可复制的。由于QObject继承自MyObject,这意味着诸如以下代码将根本无法编译...

QObject

QList<MyObject> objects; MyObject obj("title"); objects.append(obj); 的调用将产生一条错误消息,内容类似于...

  

使用已删除的功能‘MyObject :: MyObject(const MyObject&)

要实现所需的功能,您需要通过引用或指针存储objects.append(...)实例。例如...

MyObject

请注意,以上要求您不再需要{em> you 在各种const QStringList names{"Kevin", "Amy", "Michelle", "John"}; QList<MyObject *> objects; for (int i = 0; i < names.size(); i++) { MyObject *obj = new MyObject(names[i]); obj->setIndex(i); objects.append(obj); } // Sort Alphabetically std::sort(objects.begin(), objects.end(), [](const MyObject *a, const MyObject *b) -> bool { return a->getTitle() < b->getTitle(); }); // Then Sort By Index std::sort(objects.begin(), objects.end(), [](const MyObject *a, const MyObject *b) -> bool { return a->getIndex() < b->getIndex(); }); // Print info for (int i=0; i < objects.size(); i++) { qDebug() << objects[i]->getIndex(); qDebug() << objects[i]->getTitle(); } 实例上调用delete,而MyObject析构函数不会这样做为你。

根据您的特定要求,您可能不希望使用原始指针,而是考虑使用QListstd::unique_ptr的可能性。这样一来,您就不必在内存管理上完全关注自己了。