Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Получить доступ к обьекту структуры 
:(
    Опции темы
IKM2007
Дата 27.2.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Допустим у меня есть структура :
Код

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


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


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Amp
Дата 28.2.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Пробежаться по всему этому множеству айтемов, сравнивая указатель на QLabel с искомым?
PM MAIL   Вверх
SABROG
Дата 28.2.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Можно так сделать:

Код

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();
    }



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
IKM2007
Дата 28.2.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



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


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
SABROG
Дата 28.2.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91





--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.