|
|
|
|
December 1st, 2009
03:43 pm - Явный вызов конструктора. Вы когда-нибудь видели такое?
struct MyMegaStructure {
int d;
};
MyMegaStructure s = MyMegaStructure::MyMegaStructure();
Я вот сегодня увидел. Подивился. Я даже не знал, что так можно :)
|
November 25th, 2009
10:54 pm - Работать кое-как или не работать совсем? Одна из самых плохих черт QT — это чертово стремление «работать любой ценой».
Слот не соответствует сигналу? Ничего, я соберусь и запущусь, а потом тихонько напишу в консоль об этом. Конечно же, все это оценят. А консольное сообщение от оконного приложения — оно так бросается в глаза, что не заметить просто невозможно.
Нужны библиотеки для работы с SSL? Нет, я не буду требовать их при сборке программы, я лучше втихомолку подгружу их ручками во время выполнения с помощью функции LoadLibrary. А если не получится, я, опять же, расскажу всем в консоли о том, какие методы у меня unresolved.
Временами такое поведение меня просто бесит.
|
November 19th, 2009
11:16 am - Функтор в качестве обработчика сигнала в QT. Вчера я несколько погорячился, написав, что в QT невозможно в качестве обработчика сигнала задать функтор.Немного подумав, я нашел колдовство, которое побеждает их черную магию и позволяет это делать.
Итак, проблема: научить QT обрабатывать сигналы с помощью произвольного функционального объекта, а не только строго определенного слота. Решение: комбинация шаблонов и наследования.
( Read more... )
|
November 18th, 2009
11:32 pm - QT: черная шаблонная магия. QT — великолепная библиотека. Но не безупречная. Я уже писал о странном дизайнерском решении предоставить константную версию оператора QMap:: operator[], которая делает совершенно непонятные вещи. Сейчас же хочется сказать пару слов о сигналах и слотах в QT (это одна из главных отличительных особенностей библиотеки). Хотите знать, что это такое? Вам сюда.
Я, когда начинал это изучать, был удивлен реализацией. Специальный препроцессор? Обязательное наследование от QObject и какой-то магический макрос Q_OBJECT? Пф... Потом я нашел интересный документ, который называется так: «Почему в QT для реализации сигналов и слотов не используются шаблоны?». В общем-то, хорошо написано (хотя местами походит на извинения, особенно параграф «Code generators are good»). Но меня терзали смутные сомнения...
И вот я сегодня наткнулся:
qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
QObject::connect(p_socket,
SIGNAL(error(QAbstractSocket::SocketError)),
this,
SLOT(handle_socket_error(QAbstractSocket::SocketError)));
Вкратце означает вот что: если сокету нехорошо, вызвать handle_socket_error. Но без первой магической строчки оно ругается. Причем не во время компиляции. И программа даже не падает! Просто обиженно пишет на консоль:
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().) На консоль, GUI приложение. Это не так-то просто заметить. Причем, это стандартный класс (QTcpSocket), а не какая-то моя придумка.
Вот что такое истинная шаблонная магия. Когда от шаблонов отказываются, а потом их функциональность приделывают с помощью собственного кодогенератора. Только, в отличие от Александреску, это черная магия. Выглядит мерзко.
А еще, меня раздражает невозможность в качестве обработчика сигнала задать функтор. Зачем такие извращения? Об этом — как-нибудь потом.
|
|
|
|
|
|
LiveJournal.com |
|