crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

10 страниц V  « < 7 8 9 10 >  
Ответить в данную темуНачать новую тему
> Секреты и интересные возможности Qt
SABROG
  опции профиля:
сообщение 20.8.2010, 18:25
Сообщение #81


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Заметил интересную особенность при сериализации списка своих данных через оператор QDataStream в QSettings. Дело в том, что в принципе QDataStream умеет сериализовать QList, но для типа, который будет содержать контейнер нужно определять свои операторы <</>>. Предположим мы это сделали. Но при попытке сохранить список в QSettings мы получим ошибку, что тип не зарегестрирован как мета-тип:

error: ‘qt_metatype_id’ is not a member of ‘QMetaTypeId<QList<MyStruct> >’


Значит, чтобы поместить наш контейнер в QVariant надо еще прописать такую инструкцию:

Q_DECLARE_METATYPE(QList<MyStruct>)


Но и этого не достаточно. При запуске приложения мы получим ошибку:

QVariant::load: unable to load type 260.
QVariant::save: unable to save type 260.


Надо вызвать еще функцию:

qRegisterMetaTypeStreamOperators<QList<MyStruct> >("QList<MyStruct>");


Причем главное не напортачить с текстовым именем, оно должно точно совпадать с именем типа.

В итоге, чтобы поместить список с нашими данными, предположим, в .ini файл (QSettings) нужно прописать такое:

struct MyStruct
{
    QString name;
    qint32 key;
};

Q_DECLARE_METATYPE(MyStruct)
Q_DECLARE_METATYPE(QList<MyStruct>)

QDataStream& operator<<(QDataStream& ostream, const MyStruct& ms)
{
    ostream << ms.name << ms.key;
    return ostream;
}

QDataStream& operator>>(QDataStream& istream, MyStruct& ms)
{
    istream >> ms.name >> ms.key
    return istream;
}

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

    QSettings qsettings("settings.ini", QSettings::IniFormat);
    qRegisterMetaTypeStreamOperators<MyStruct>("MyStruct");
    qRegisterMetaTypeStreamOperators<QList<MyStruct> >("QList<MyStruct>");

    QList<MyStruct> msList;
    MyStruct ms = {"MyStruct name", 123};
    msList << ms;
    qsettings.setValue("ListMyStruct", qVariantFromValue(msList));
    return 0;
}


Обратите внимание, там где вызывается второй раз qRegisterMetaTypeStreamOperators обычно предполагается, что вы где-то реализовали операторы
для сериализации этого типа, но у нас эти операторы реализованы только для MyStruct. Дело в том, что Qt сама реализовала эти операторы для класса QList, нам лишь нужно сообщить какого типа данные он будет содержать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_xls_*
сообщение 31.8.2010, 11:31
Сообщение #82





Гости








    


Цитата
namespace Hack { template <class To, class From> inline To* d_ptr(From* ptr){ return (To*)QObjectPrivate::get(ptr);}}

К сожалению классы, у которых ##Private член не объявлен в *_p.h заголовочнике не позволяют сделать такой фокус.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.9.2010, 8:21
Сообщение #83


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Гость_xls_* @ 31.8.2010, 12:31) *
К сожалению классы, у которых ##Private член не объявлен в *_p.h заголовочнике не позволяют сделать такой фокус.

А конкретный пример можно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_xls_*
сообщение 2.9.2010, 9:08
Сообщение #84





Гости








    


Цитата(SABROG @ 1.9.2010, 8:21) *
Цитата(Гость_xls_* @ 31.8.2010, 12:31) *
К сожалению классы, у которых ##Private член не объявлен в *_p.h заголовочнике не позволяют сделать такой фокус.

А конкретный пример можно?

QTabWidgetPrivate из QTabWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 5.9.2010, 18:55
Сообщение #85


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(xls @ 2.9.2010, 10:08) *
QTabWidgetPrivate из QTabWidget

Через include можно подключить и .cpp файл, в надежде на то, что он удачно скомпилиться, что иногда бывает, умный оптимизатор выкинет код, который не используется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xls
  опции профиля:
сообщение 6.9.2010, 9:27
Сообщение #86


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 6.9.2010
Пользователь №: 2013

Спасибо сказали: 7 раз(а)




Репутация:   2  


Цитата(SABROG @ 5.9.2010, 18:55) *
Через include можно подключить и .cpp файл, в надежде на то, что он удачно скомпилиться, что иногда бывает, умный оптимизатор выкинет код, который не используется.

Это будет не неиспользуемый, а дважды используемый код - один раз из моего cpp и второй из qt библиотеки - с соответствующим сообщением линковщика. ИМХО, лучше QObject::findChildren ничего еще не придумали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.9.2010, 8:43
Сообщение #87


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(xls @ 6.9.2010, 10:27) *
ИМХО, лучше QObject::findChildren ничего еще не придумали.

findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена.

Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_xls_*_*
сообщение 13.11.2010, 12:35
Сообщение #88





Гости








    


Цитата(SABROG @ 7.9.2010, 8:43) *
Цитата(xls @ 6.9.2010, 10:27) *
ИМХО, лучше QObject::findChildren ничего еще не придумали.

findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена.

Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах.

А вот что пишут по этому поводу тролли:
//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists for the convenience
// of qsql*model.h .  This header file may change from version to version
// without notice, or even be removed.
//
// We mean it.
//
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 13.11.2010, 13:15
Сообщение #89


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(SABROG @ 7.9.2010, 8:43) *
Думаю это не стандартная практика объявлять классы в .cpp файлах.

почему же?
вполне нормально об этом Саттер и Элджер в частности пишут.
используется при создании фабрик обЪектов с использованием NVI - невиртуального интерфейса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Yuriy_*
сообщение 20.12.2010, 14:57
Сообщение #90





Гости








    


[quote name='Litkevich Yuriy' date='5.2.2009, 19:45' post='14041']
обнаружил интересное поведение в QTableView
если выделена ячейка в столбце N, то нажимая кнопки букв или цифр на клавиатуре будет осуществлятся навигация по этому столбцу


Здравствуйте! В QListWidget тоже присутствует такое поведение, при нажатии на букву, список перемещаеться на заглавную (нажатую) букву.
Вот, так может знает кто возможность отключения такого поведения , по причине , что при этом нету реакции на keyPressEvent(QKeyEvent *pe) . Реагирует только на кнопки Ф1 - Ф 12 , шифт, таб, и т.п
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

10 страниц V  « < 7 8 9 10 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 19:04