3.22.2011

Про ограничения и последствия.

Qt довольно очень библиотека. Сильная и объемная. Но также есть и довольно неприятные ограничения. Например нельзя мешать template и Q_OBJECT, нельзя наследоваться от двух разных QObject'ов. и еще там по мелочам.


В результате приходится изворачиваться.


Вот например что пришлось прикрутить вместо шаблонов:

[cc lang="C++"]
#ifndef TAG_CONTAINER_DEFINES_H
#define TAG_CONTAINER_DEFINES_H

#include "wtagcontainer.h"

#define HACC_TAG_CONTAINER_DECLARE(_name) \
namespace ui { namespace tag { \
class W##_name##Tags : public base::WTagContainer, public hacc::model::C##_name \
{ \
public: \
explicit W##_name##Tags(QWidget *parent = 0); \
~W##_name##Tags(); \
void setObjectName(const QString &name); \
private: \
QString selectSQL(bool attachedOnly); \
hacc::TDBId itemID(); \
void tagClickedEvent(const hacc::TDBId &tagID); \
hacc::model::TItemTags & itemTags(); \
};}}


#define HACC_TAG_CONTAINER_REALIZE(_name,_bases) \
namespace ui { namespace tag { \
W##_name##Tags:: W##_name##Tags (QWidget *parent) : WTagContainer(parent), hacc::model::C##_name() {} \
W##_name##Tags::~W##_name##Tags () {} \
hacc::TDBId W##_name##Tags::itemID () { return id(); } \
QString W##_name##Tags::selectSQL (bool attachedOnly ) { return attachedOnly ? _bases->selectSelfTagsQuery() : _bases->selectAllTagsQuery(); } \
void W##_name##Tags::tagClickedEvent (const hacc::TDBId &tagID) { setAttached(tagID, _bases->retachTag(tagID, id())); } \
void W##_name##Tags::setObjectName (const QString &name ) { WTagContainer::setObjectName(name); } \
hacc::model::TItemTags & W##_name##Tags:: itemTags() { return _bases->tags(id()); } \
}}

#endif // TAG_CONTAINER_DEFINES_H

[/cc]

"Потомков" этого - шесть штук. Замучился бы поддерживать по отдельности...


Оригинал записи - в личном блоге. Комментировать можно тут, но желательно там.

Комментариев нет: