Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Получить доступ к обьекту структуры


Автор: IKM2007 27.2.2010, 21:56
Допустим у меня есть структура :
Код

struct Item
{
   QLabel *item;
   int posIndex;
   bool isWrite;
};


В программе у меня 30 обьектов типа Item, в методе dragEnterEvent(QDragEnterEvent *event) я получаю доступ к конкретному QLabel, в методе dropEvent(QDropEvent *event); мне нужно выполнить действия именно с обьектом структуры, чьим членом является этот QLabel. Как такое сделать?

Автор: Amp 28.2.2010, 00:24
Пробежаться по всему этому множеству айтемов, сравнивая указатель на QLabel с искомым?

Автор: SABROG 28.2.2010, 00:39
Можно так сделать:

Код

struct Item
{
    int posIndex;
    bool isWrite;
};
// объявляем новый мета-тип, чтобы можно было поместить в QVariant
Q_DECLARE_METATYPE(Item)
...
    Item item;
    item.isWrite = false;
    item.posIndex = 2;
// создаем динамическое свойство item и конвертируем в QVariant
    label->setProperty("item", qVariantFromValue(item));
...
    QVariant var = label->property("item");
// проверяем возможно ли конвертирование, если нет, то выводим отладочное сообщение (debug)
    Q_ASSERT(qVariantCanConvert<Item>(var));
// преобразуем из QVariant в Item
    Item labelItem = qvariant_cast<Item>(var);


Или так:

Код

typedef QPair<int, bool> Item;
Q_DECLARE_METATYPE(Item)
...
    Item item;
    item.first = 2;
    item.second = false;
    ui->label->setProperty("item", qVariantFromValue(item));
    QVariant var = ui->label->property("item");
    Q_ASSERT(qVariantCanConvert<Item>(var));
    Item labelItem = qvariant_cast<Item>(var);


Или так:

Код

struct Item
{
    int posIndex;
    bool isWrite;
};
typedef QSharedPointer<Item> psItem;
typedef QWeakPointer<Item> pwItem;
Q_DECLARE_METATYPE(pwItem)
...
    psItem item(new Item);
    item->posIndex = 2;
    item->isWrite = false;
// получаем слабый указатель, чтобы контролировать время жизни объекта
    ui->label->setProperty("item", qVariantFromValue(item.toWeakRef()));
...
    QVariant var = ui->label->property("item");
    Q_ASSERT(qVariantCanConvert<pwItem>(var));
    pwItem pwLabelItem = qvariant_cast<pwItem>(var);
// пытаемся преобразовать слабый указатель на умный указатель
    psItem psLabelItem = pwLabelItem.toStrongRef();
// если объект уже удален сообщаем об этом в консоль
    Q_ASSERT(psLabelItem);


Я намеренно убрал указатель на QLabel, чтобы не смешивать GUI и бизнес логику. И если уж вообще никак не получается не смешивать, то лучше тогда держать указатель на QObject.

Код

struct Item
{
    QWeakPointer<QObject> object;
    int posIndex;
    bool isWrite;
};

typedef QSharedPointer<Item> psItem;
typedef QWeakPointer<Item> pwItem;
Q_DECLARE_METATYPE(pwItem)
...
    psItem item(new Item);
    {
        item->object = QWeakPointer<QObject>(ui->label);
        item->posIndex = 2;
        item->isWrite = false;

        ui->label->setProperty("item", qVariantFromValue(item.toWeakRef()));
    }

    QVariant var = ui->label->property("item");
    {
        Q_ASSERT(qVariantCanConvert<pwItem>(var));
        pwItem pwLabelItem = qvariant_cast<pwItem>(var);

        psItem psLabelItem = pwLabelItem.toStrongRef();
        QObject* object = psLabelItem->object.data();

        Q_CHECK_PTR(object);
        Q_ASSERT(psLabelItem);

        QLabel* label = 0;

        if (object->isWidgetType() && object->inherits("QLabel"))
            label = qobject_cast<QLabel*>(object);

        Q_CHECK_PTR(label);

        qDebug() << psLabelItem->isWrite << psLabelItem->posIndex << label->text();
    }

Автор: IKM2007 28.2.2010, 16:41
SABROG, я еще не сталкивался с мета-обьектами, откуда можно прочитать про них? (хотелось бы книгу, а не документацию).

Автор: SABROG 28.2.2010, 17:10
http://cartan.cas.suffolk.edu/oopdocbook/opensource/properties.html

http://narod.ru/disk/17528995000/%D0%9C%D0%B0%D0%BA%D1%81%20%D0%A8%D0%BB%D0%B5%D0%B5%20-%20QT4.5.%20%D0%9F%D1%80%D0%BE%D1%84%D0%B5%D1%81%D1%81%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20C%2B%2B.djvu.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)