Метод продвижения является самым быстрым и самым простым. Он заключается в выборе некоторого встроенного виджета Qt, программный интерфейс которого похож на программный интерфейс пользовательского виджета, и заполнении полей диалогового окна в Qt Designer некоторыми данными о пользовательском виджете. Впоследствии этот виджет может использоваться в формах, разработанных с помощью Qt Designer, но при редактировании или просмотре он отображается просто в виде выбранного встроенного виджета Qt.
Ниже приводится порядок действий при интеграции данным методом виджета HexSpinBox:
1. Создайте наборный счетчик QSpinBox, перетаскивая его с панели виджетов Qt Designer на форму.
2. Щелкните правой клавишей мышки по наборному счетчику и выберите пункт контекстного меню Promote to Custom Widget (Преобразовать в пользовательский виджет).
3. Заполните в появившемся диалоговом окне поле названия класса значением «HexSpinBox» и поле заголовочного файла значением «hexspinbox.h».
Вот и все! Сгенерированный компилятором uic программный код будет содержать оператор #include hexspinbox.h вместо и будет инстанцировать HexSpinBox. В Qt Designer виджет HexSpinBox будет представлен виджетом QSpinBox, позволяя нам устанавливать любые свойства QSpinBox (например, допустимый диапазон значений и текущее значение).
Рис. 5.6. Диалоговое окно для создания пользовательских виджетов Qt Designer.
Недостатками метода продвижения являются недоступность в Qt Designer свойств, характерных для пользовательского виджета, и то, что пользовательский виджет представляется в QtDesigner не своим изображением. Обе эти проблемы могут быть решены при применении метода подключения.
Метод подключения требует создания библиотеки подключаемых модулей, которую Qt Designer может загружать во время выполнения и использовать для создания экземпляров виджетов. В этом случае при редактировании формы и ее просмотре в Qt Designer будет использован реальный виджет, и благодаря мета—объектной системе Qt можно динамически получать список его свойств в Qt Designer. Для демонстрации этого метода мы с его помощью выполним интеграцию редактора пиктограмм IconEditor, описанного в предыдущем разделе.
Во-первых, мы должны создать подкласс QDesignerCustomWidgetInterface и переопределить несколько виртуальных функций. Мы предположим, что исходный файл подключаемого модуля расположен в каталоге с именем iconeditorplugin, а исходный текст программы IconEditor расположен в параллельном каталоге с именем iconeditor.
Ниже приводится определение класса:
01 #include
02 class IconEditorPlugin : public QObject,
03 public QDesignerCustomWidgetInterface
04 {
05 Q_OBJECT
06 Q_INTERFACES(QDesignerCustomWidgetInterface)
07 public:
08 IconEditorPlugin(QObject *parent = 0);
09 QString name() const;
10 QString includeFile() const;
11 QString group() const;
12 QIcon icon() const;
13 QString toolTip() const;
14 QString whatsThis() const;
15 bool isContainer() const;
16 QWidget *createWidget(QWidget *parent);
17 };
Подкласс IconEditorPlugin является фабрикой класса (factory class), который инкапсулирует виджет IconEditor. Он является наследником классов QObject и QDesignerCustomWidgetIterface и использует макрос Q_INTERFACES(), указывая компилятору moc на то, что второй базовый класс представляет собой подключаемый интерфейс. Его функции применяются Qt Designer для создания экземпляров класса и получения информации о нем.
01 IconEditorPlugin::IconEditorPlugin(QObject *parent)
02 : QObject(parent)
03 {
04 }
IconEditorPlugin имеет тривиальный конструктор.
05 QString IconEditorPlugin::name() const
06 {
07 return "IconEditor";
08 }
Функция name() возвращает имя подключаемого виджета.
09 QString IconEditorPlugin::includeFile() const
10 {
11 return "iconeditor.h";
12 }