Свойство Qt Index возвращает отрицательное число - PullRequest
0 голосов
/ 18 декабря 2018

Я в растерянности.У меня есть объект класса, где я устанавливаю свойство в значение 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 голосов
/ 18 декабря 2018

Ваш пример кода страдает от ряда проблем, но там достаточно, чтобы увидеть (я думаю), что вы пытаетесь сделать.

Во-первых, приведенный код на самом деле не добавляет никаких MyObject экземпляров.в переменную QList<MyObject> и - на основе некоторого закомментированного кода - вы уже столкнулись с самой большой проблемой: QObject не копируется.Поскольку MyObject наследуется от QObject, это означает, что код, подобный следующему, просто не будет компилироваться ...

QList<MyObject> objects;
MyObject obj("title");
objects.append(obj);

При вызове objects.append(...) будет сгенерировано сообщение об ошибке в виде строки...

использование удаленной функции 'MyObject :: MyObject (const MyObject &)

Чтобы достичь того, что вы хотите, вам нужно хранить экземпляры MyObject с помощьюссылка или указатель.Например ...

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, когда они вам больше не нужны - QListДеструктор не сделает это за вас.

Вместо использования необработанных указателей вы можете рассмотреть возможность использования std::unique_ptr или std::shared_ptr в зависимости от ваших конкретных требований.Таким образом, вам не нужно беспокоиться об управлении памятью в той же степени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...