Пример "SIP Dialog"
|
Иногда для диалога необходимо получить SIP в учётную запись, так как SIP может скрыть важные виджеты ввода информации. Пример "SIP Dialog" показывает, как объект Dialog, dialog, может изменить размеры соответственно, если SIP открыт, встраивая содержимое диалога dialog в QScrollArea.
Класс Dialog является подклассом QDialog, который реализует открытый слот, desktopResized(), и открытую функцию , reactToSIP(). Также, он храните закрытый экземпляр класса QRect, desktopGeometry.
class Dialog : public QDialog { Q_OBJECT public: Dialog(); void reactToSIP(); private: QRect desktopGeometry; public slots: void desktopResized(int screen); };
В конструкторе Dialog мы начинаем получение доступной геометрии экрана с помощью availableGeometry(). Используется параметр 0 для извещения о том, что нам требуется главный экран.
Dialog::Dialog() { desktopGeometry = QApplication::desktop()->availableGeometry(0); setWindowTitle(tr("SIP Dialog Example")); QScrollArea *scrollArea = new QScrollArea(this); QGroupBox *groupBox = new QGroupBox(scrollArea); groupBox->setTitle(tr("SIP Dialog Example")); QGridLayout *gridLayout = new QGridLayout(groupBox); groupBox->setLayout(gridLayout);
Му установили заголовок окна в значение "SIP Dialog Example" и объявили объект QScrollArea, scrollArea. Следующим мы создаём экземпляр класса QGroupBox, groupBox, с scrollArea в качестве родителя. Заголовок groupBox также установлен в значение "SIP Dialog Example". Объект QGridLayout, gridLayout, затем используется как компоновка groupBox'а.
Мы создаём QLineEdit, QLabel и QPushButton и мы установили свойство minimumWidth равным 220 пикселей, соответственно.
QLineEdit* lineEdit = new QLineEdit(groupBox); lineEdit->setText(tr("Open and close the SIP")); lineEdit->setMinimumWidth(220); QLabel* label = new QLabel(groupBox); label->setText(tr("This dialog resizes if the SIP is opened")); label->setMinimumWidth(220); QPushButton* button = new QPushButton(groupBox); button->setText(tr("Close Dialog")); button->setMinimumWidth(220);
Также устанавливается текст всех трех виджетов соответственно. Свойство verticalSpacing gridLayout устанавливается на основе высоты desktopGeometry. Это сделано для адаптации к разным форм-факторам Windows Mobile. Затем мы добавляем наши виджеты в компоновку.
if (desktopGeometry.height() < 400) gridLayout->setVerticalSpacing(80); else gridLayout->setVerticalSpacing(150); gridLayout->addWidget(label); gridLayout->addWidget(lineEdit); gridLayout->addWidget(button);
Виджет scrollArea'а установлен в groupBox. Мы используем объект класса QHBoxLayout, layout, вмещающего в себе scrollArea. Компоновка Dialog'а установлена в layout и горизонтальная полоса прокрутки прокручиваемой области отключена.
scrollArea->setWidget(groupBox); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(scrollArea); setLayout(layout); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Следующие сигналы соединены с соответствующими им слотами:
connect(button, SIGNAL(clicked()), qApp, SLOT(closeAllWindows())); connect(QApplication::desktop(), SIGNAL(workAreaResized(int)), this, SLOT(desktopResized(int))); }
Функция desktopResized() принимает целое число, screen, соответствующее индексу экрана. Мы вызываем reactToSIP() только если screen - главный экран (например, index = 0).
void Dialog::desktopResized(int screen) { if (screen != 0) return; reactToSIP(); }
Функция reactToSIP() изменяет размер dialog соответственно, если доступная геометрия рабочего стола изменилась по вертикали, так как это изменение означает, что SIP может быть открыт или закрыт.
void Dialog::reactToSIP() { QRect availableGeometry = QApplication::desktop()->availableGeometry(0); if (desktopGeometry != availableGeometry) { if (windowState() | Qt::WindowMaximized) setWindowState(windowState() & ~Qt::WindowMaximized); setGeometry(availableGeometry); } desktopGeometry = availableGeometry; }
Если высота уменьшилась, мы сбрасываем состояние максимизации окна. В противном случае, мы установим состоянии максимизации окна. В заключение, мы обновляем desktopGeometry до доступной геометрии рабочего стола.
Функция main() для пример "SIP Dialog" создаёт экземпляр Dialog и вызывает его функцию exec().
int main(int argc, char *argv[]) { QApplication app(argc, argv); Dialog dialog; return dialog.exec(); }
Замечание: Хотя этот пример использует диалог, используемые здесь приёмы применимы ко всем виджетам верхнего уровня соответственно.
Авторские права © 2010 Nokia Corporation и/или её дочерние компании | Торговые марки | Qt 4.6.4 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |