Пример "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();
}
Замечание: Хотя этот пример использует диалог, используемые здесь приёмы применимы ко всем виджетам верхнего уровня соответственно.
| Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies) | Торговые марки | Qt 4.6.4 |
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |