[Предыдущая: Портирование на Qt 4 - Перетаскивание (Drag and Drop)] [Содержание] [Следующая: Переход на Графическое представление] Портирование файлов .ui в Qt 4
|
| Класс в Qt 3 | Класс в Qt 4 |
|---|---|
| QButtonGroup | Q3ButtonGroup |
| QDateEdit | Q3DateEdit |
| QDateTimeEdit | Q3DateTimeEdit |
| QGroupBox | Q3GroupBox |
| QListBox | Q3ListBox |
| QListView | Q3ListView |
| QMainWindow | Q3MainWindow |
| QTextEdit | Q3TextEdit |
| QTextView | Q3TextView |
| QTimeEdit | Q3TimeEdit |
| QWidgetStack | Q3WidgetStack |
| QWizard | Q3Wizard |
Конвертирование .ui-файлов Qt 3 на Qt 4 имеет некоторые ограничения. Большинство достойных внимания ограничений фактически заключаются в том, что так как uic больше не генерирует QObject, то невозможно определить пользовательские сигналы или слоты для формы. Взамен, программист должен определить эти сигналы и слоты в главном контейнере и соединить их с виджетами на форме после вызова setupUi(). Например:
class HelloWorldWidget : public QWidget, public Ui::HelloWorld
{
Q_OBJECT
public:
HelloWorldWidget(QWidget *parent = 0);
public slots:
void mySlot();
};
HelloWorldWidget::HelloWorldWidget(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
QObject::connect(pushButton, SIGNAL(clicked()),
this, SLOT(mySlot()));
}
void HelloWorldWidget::mySlot()
{
...
}
Небрежный способ портирования форм, содержащих пользовательские сигналы и слоты, - генерация кода используя uic3, а не uic. Так как uic3 генерирует QWidget, он заполняет его пользовательским сигналам, слотам и соединениям указанным в .ui-файле. Однако uic3 может генерировать только код из .ui-файлов Qt 3, которые подразумевают что .ui-файлы никогда не получают перевод и нужно редактировать используя Qt Designer 3.
Обратите также внимание на то, что можно создать скрытые соединения между виджетами в форме и главном контейнере. После заполнения setupUi() главного контейнера с дочерними виджетами она просматривает список слотов главного контейнера в поисках имён с формой on_objectName_signalName().
Если форма содержит виджет, чьё имя объекта - objectName, и если этот виджет имеет сигнал с именем signalName, тогда этот сигнал будет соединён со слотом главного контейнера. Например:
class HelloWorldWidget : public QWidget, public Ui::HelloWorld
{
Q_OBJECT
public:
HelloWorldWidget(QWidget *parent = 0);
public slots:
void on_pushButton_clicked();
};
HelloWorldWidget::HelloWorldWidget(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
}
void HelloWorldWidget::on_pushButton_clicked()
{
...
}
Из-за соглашения об именовании setupUi() автоматически соединяет сигнал pushButton'а, clicked(), со слотом HelloWorldWidget'а, on_pushButton_clicked().
В Qt 3 двоичные данные для пиктограмм используются в форме сохраняются в .ui-файл. В Qt 4 пиктограммы и любые другие внешние файлы могут быть скомпилированы в приложение перечислив их в файле ресурсов (.qrc). Этот файл преобразовывается в файл исходных кодов C++ используя компилятор ресурсов Qt (rcc). После этого данные в файлах доступны для любого класса Qt, который получает аргумент с именем файла.
Представьте себе, что у нас есть две пиктограммы, yes.png и no.png. Мы создаём файл ресурсов с именем icons.qrc со следующим содержимым:
<RCC version="1.0">
<qresource prefix="/icons">
<file>yes.png</file>
<file>no.png</file>
</qresource>
</RCC>
Далее, мы добавляем файл ресурса в наш .pro-файл:
RESOURCES += icons.qrc
Когда запущен qmake, он создаст соответствующие правила Make-файла для вызова rcc с файлом ресурсов, и компилирует и линкует результат в приложение. Доступ к пиктограммам можно получить как изложено ниже:
QFile file(":/icons/yes.png");
QIcon icon(":/icons/no.png");
QPixmap pixmap(":/icons/no.png");
В каждом подобном случае, ведущее двоеточие сообщает Qt искать файл в виртуальном дереве файлов, описанном набором файлов ресурсов, скомпилированных в приложение вместо файловой системы.
В файле .qrc, атрибут тега qresource, prefix, используется для размещения файлов по категориям и установки виртуального пути, по которому будут доступны файлы.
Предупреждение: Если файл ресурса не был слинкован непосредственно в приложение, а вместо этого в динамическую или статическую библиотеку, которая позднее линкуется с приложением, его виртуальное дерево файлов не будет доступно для QFile и его друзей, пока не вызван макрос Q_INIT_RESOURCE(). Этот макрос принимает один аргумент, которым является имя файла .qrc, без пути или расширения файла. Удобным местом для инициализации ресурсов является верхняя часть функции main() приложения.
В Qt Designer 4 мы можем связать любое количество файлов ресурсов с формой, используя инструмент редактора ресурсов. Виджеты в форме могут получить доступ ко всем пиктограммам, указанным в соответствующих файлах ресурсов.
Вкратце, портирование пиктограмм из Qt 3 на форму Qt 4 приводит к следующим шагам:
Qt Designer 3 поддерживает определение пользовательских виджетов указанием их имён, заголовочного файла и методов. В Qt Designer 4 пользовательский виджет всегда создаётся "продвигая" существующий виджет Qt в пользовательский класс. Qt Designer 4 принимает, что пользовательский виджет будет унаследован от виджета, который был продвинут. В редакторе форм, пользовательский виджет будет помнить внешний вид, поведение, свойства, сигналы и слоты базового виджета. В настоящее время невозможно сообщить Qt Designer 4 о том, что пользовательский виджет будет иметь дополнительные сигналы и слоты.
uic3 -convert обрабатывает преобразование пользовательских виджетов в новый формат .ui, тем не менее все пользовательские сигналы и слоты будут потеряны. Кроме того, так как Qt Designer 3 никогда не знает о базовом классе пользовательского виджета, он берёт QWidget. Этого часто достаточно. Если нет, пользовательские виджеты вставляются в форму вручную.
Подключаемые модули пользовательских виджетов, которые содержат пользовательские виджеты, используемые в Qt Designer, сами должны быть портированы перед тем, как они могут быть использованы в формах, портированных с помощью uic3. Документ Портирование на Qt 4 содержит информацию об основных проблемах портирования, которые могут быть применены к коду самого пользовательского виджета, а глава Создание пользовательских виджетов для Qt Designer Руководства по Qt Designer описывает как можно собрать портированный виджет, чтобы он работал в Qt Designer 4.
[Предыдущая: Портирование на Qt 4 - Перетаскивание (Drag and Drop)] [Содержание] [Следующая: Переход на Графическое представление]
| Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) | Торговые марки | Qt 4.5.3 |
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |