Пример Custom Widget Plugin
Файлы:
Пример "Custom Widget" показывает, как создать подключаемый модуль пользовательского виджета для Qt Designer'а. В этом примере используется пользовательский виджет на основе примера "Analog Clock", а пользовательские сигналы и слоты не предоставляются. ПодготовкаЧтобы предоставить пользовательский виджет, который может быть использован с Qt Designer'ом, мы должны обеспечить самодостаточную реализацию и предоставить интерфейс подключения. В этом примере, мы, для удобства, повторно используем пример "Analog Clock". Так как подключаемый модуль пользовательского виджета зависит от компонентов применяемых с Qt Designer'ом, то файл проекта, который мы используем, должен содержать информацию о библиотечных компонентах Qt Designer'а: TEMPLATE = lib CONFIG += designer plugin debug_and_release Значение переменной TEMPLATE указывает qmake создать пользовательский виджет как библиотеку. Позднее мы позаботимся о том, чтобы виджет был принят как подключаемый модуль в Qt, используя макрос Q_EXPORT_PLUGIN2() для экспорта соответствующей информации о виджете. Переменная CONFIG содержит два значения - designer и plugin:
Когда Qt сконфигурирована в обоих режимах debug и release, Qt Designer будет собран в release режиме. В этом случае, необходимо гарантировать, что подключаемый модуль также был собран в режиме release. По этой причине мы добавили значение debug_and_releaseв переменную CONFIG. В противном случае, если подключаемый модуль собран в режиме, который несовместим с Qt Designer, он не будет загружен и установлен. Заголовочные и исходные файлы для виджета объявляются обычным способом, и мы предоставляем реализацию интерфейса подключаемого модуля так, что Qt Designer может использовать пользовательский виджет: HEADERS = analogclock.h \ customwidgetplugin.h SOURCES = analogclock.cpp \ customwidgetplugin.cpp Также важно убедиться, что подключаемый модуль устанавливается в туда, где его будет искать Qt Designer. Мы делаем это, определяя целевой путь для проекта и добавляя его в список элементов для установки: target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target Пользовательский виджет будет создан как библиотека и будет установлен рядом с другими подключаемыми модулями Qt Designer'а, когда проект будет установлен (используйте make install или другую эквивалентную процедуру). Позднее, мы позаботимся, чтобы он распознавался как подключаемый модуль Qt Designer'а, используя макрос Q_EXPORT_PLUGIN2() для экспортирта информации, связанной с виджетом. Заметьте, что если вы хотите, чтобы подключаемый модуль отображался в интеграторе Visual Studio, подключаемый модуль должен быть собран в режиме release и его библиотеки должны быть скопированы в каталог подключаемых модулей, где установлен интегратор (например, см. C:/program files/trolltech as/visual studio integration/plugins). Для получения дополнительной информации о подключаемых модулях, смотрите документацию Как создавать плагины Qt. Описание и реализация класса AnalogClockКласс AnalogClock объявлен и реализован в точности так же, как описано в примере "Аналоговые часы". Так как класс самодостаточен и не требует внешней конфигурации, он может быть использован без изменений как пользовательский виджет в Qt Designer'е. Описание класса AnalogClockPluginКласс AnalogClock отображается в Qt Designer через класс AnalogClockPlugin. Этот класс унаследован от двух классов, QObject и QDesignerCustomWidgetInterface и реализует интерфейс, определенный в QDesignerCustomWidgetInterface: class AnalogClockPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: AnalogClockPlugin(QObject *parent = 0); bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: bool initialized; }; Функции предоставляют информацию о виджете, которую может использовать Qt Designer в списке виджетов (widget box). Частная переменная-член initialized используется, чтобы записать, инициализирован ли Qt Designer'ом подключаемый модуль или нет. Заметьте, что только часть определения класса, которая специфична для этого отдельного пользовательского виджета, является именем класса. Реализация AnalogClockPluginКонструктор класса просто вызывает конструктор базового класса QObject и устанавливает переменную initialized в значение false. AnalogClockPlugin::AnalogClockPlugin(QObject *parent) : QObject(parent) { initialized = false; } Qt Designer инициализирует подключаемый модуль, когда он потребуется, вызовом функции initialize(): void AnalogClockPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{
if (initialized)
return;
initialized = true;
}
В этом примере приватная переменная initialized проверяется и устанавливается в значение true только если модуль еще не инициализирован. Хотя этот модуль не требует ни какого специального исполняемого кода при инициализации, мы можем включить такой код после теста на инициализацию. Функция isInitialized() позволяет Qt Designer'у узнать готов ли модуль к использованию: bool AnalogClockPlugin::isInitialized() const { return initialized; } Экземпляры пользовательского виджета создаются с помощью функции createWidget(). Реализация для пример analog clock - непосредственная: QWidget *AnalogClockPlugin::createWidget(QWidget *parent) { return new AnalogClock(parent); } В данном случае пользовательский виджет требует только определения parent. Если виджету понадобятся другие аргументы, они могут быть определены здесь. Следующие функции предоставляют Qt Designer информаию, необходимую для представления виджета на панели виджетов (widget box). Функция name() возвращает имя класса, который предоставляет пользовательский виджет: QString AnalogClockPlugin::name() const { return "AnalogClock"; } Функция group() используется для описания типа виджета, к которому относится пользовательский виджет: QString AnalogClockPlugin::group() const { return "Display Widgets [Examples]"; } Подключаемый модуль виджета будет помещен в секцию, идентифицируемую именем его группы на панели виджетов (widget box) Qt Designer'а. Иконку, которой будет обозначен виджет на панели виджетов, предоставляет функция icon(): QIcon AnalogClockPlugin::icon() const { return QIcon(); } В нашем случае мы возвращаем null, чтобы показать, что у нас нет иконки для представления виджета. Пользовательский виджет может быть снабжен всплывающей подсказкой и подсказкой "What's This?". Функция toolTip()должна возвращать короткое сообщение, описывающее виджет: QString AnalogClockPlugin::toolTip() const { return ""; } Функция whatsThis() может возвращать более подробное описание: QString AnalogClockPlugin::whatsThis() const { return ""; } Функция isContainer() сообщает Qt Designer возможно ли использовать виджет в качестве контейнера других виджетов. Если нет, Qt Designer не позволит пользователю размещать виджеты внутри него. bool AnalogClockPlugin::isContainer() const { return false; } Большинство виджетов в Qt могут содержать дочерние виджеты, но для этой цели имеет смысл использовать только специализированные контейнерные виджеты в Qt Designer. Возвращая false, мы показываем, что пользовательский виджет не может содержать другие виджеты; если мы возвращаем true, Qt Designer позволит размещать другие виджеты внутри аналоговых часов и будет определён компоновщик. Функция domXml() предоставляет возможность включить для виджета настройки по умолчанию в стандартном формате XML, используемом в Qt Designer. В данном случае, мы описываем только геометрию виджета: QString AnalogClockPlugin::domXml() const { return "<widget class=\"AnalogClock\" name=\"analogClock\">\n" " <property name=\"geometry\">\n" " <rect>\n" " <x>0</x>\n" " <y>0</y>\n" " <width>100</width>\n" " <height>100</height>\n" " </rect>\n" " </property>\n" " <property name=\"toolTip\" >\n" " <string>The current time</string>\n" " </property>\n" " <property name=\"whatsThis\" >\n" " <string>The analog clock widget displays " "the current time.</string>\n" " </property>\n" "</widget>\n"; } Если виджет обеспечивает приемлемые подсказки размера (size hint), нет необходимости описывать их здесь. Кроме того, возвращение пустой строки вместо элемента <widget> укажет Qt Designer не инсталлировать виджет на панель виджетов (widget box). Чтобы сделать виджет аналоговых часов пригодным к использованию в приложениях, мы реализуем функцию includeFile(), чтобы вернуть имя заголовочного файла, содержащего объявление класса пользовательского виджета: QString AnalogClockPlugin::includeFile() const { return "analogclock.h"; } В заключение, мы используем макрос Q_EXPORT_PLUGIN2(), чтобы экспортировать класс AnalogClockPlugin для использования с Qt Designer'ом: Q_EXPORT_PLUGIN2(customwidgetplugin, AnalogClockPlugin) Этот макрос гарантирует, что Qt Designer может получить доступ к пользовательскому виджету и создавать его. Без этого макроса не существует способа, чтобы использовать виджет в Qt Designer'е.
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |