Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
SABROG |
20.8.2010, 18:25
Сообщение
#81
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34
|
Заметил интересную особенность при сериализации списка своих данных через оператор QDataStream в QSettings. Дело в том, что в принципе QDataStream умеет сериализовать QList, но для типа, который будет содержать контейнер нужно определять свои операторы <</>>. Предположим мы это сделали. Но при попытке сохранить список в QSettings мы получим ошибку, что тип не зарегестрирован как мета-тип:
Значит, чтобы поместить наш контейнер в QVariant надо еще прописать такую инструкцию: Но и этого не достаточно. При запуске приложения мы получим ошибку: Надо вызвать еще функцию: Причем главное не напортачить с текстовым именем, оно должно точно совпадать с именем типа. В итоге, чтобы поместить список с нашими данными, предположим, в .ini файл (QSettings) нужно прописать такое: Обратите внимание, там где вызывается второй раз 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) Link К сожалению классы, у которых ##Private член не объявлен в *_p.h заголовочнике не позволяют сделать такой фокус. А конкретный пример можно? |
|
|
|
| Гость_xls_* |
2.9.2010, 9:08
Сообщение
#84
|
|
Гости |
Цитата(SABROG @ 1.9.2010, 8:21) Link Цитата(Гость_xls_* @ 31.8.2010, 12:31) Link К сожалению классы, у которых ##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) Link QTabWidgetPrivate из QTabWidget Через include можно подключить и .cpp файл, в надежде на то, что он удачно скомпилиться, что иногда бывает, умный оптимизатор выкинет код, который не используется. |
|
|
|
|
xls |
6.9.2010, 9:27
Сообщение
#86
|
|
Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 6.9.2010 Пользователь №: 2013 Спасибо сказали: 7 раз(а) Репутация: 2
|
Цитата(SABROG @ 5.9.2010, 18:55) Link Через 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) Link ИМХО, лучше QObject::findChildren ничего еще не придумали. findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена. Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах. |
|
|
|
| Гость_Гость_xls_*_* |
13.11.2010, 12:35
Сообщение
#88
|
|
Гости |
Цитата(SABROG @ 7.9.2010, 8:43) Link Цитата(xls @ 6.9.2010, 10:27) Link ИМХО, лучше QObject::findChildren ничего еще не придумали. findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена. Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах. А вот что пишут по этому поводу тролли:
|
|
|
|
|
kwisp |
13.11.2010, 13:15
Сообщение
#89
|
|
астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23
|
Цитата(SABROG @ 7.9.2010, 8:43) Link Думаю это не стандартная практика объявлять классы в .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 , шифт, таб, и т.п |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 22.12.2025, 14:06 |