KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Жасмин Бланшет - QT 4: программирование GUI на С++

Жасмин Бланшет - QT 4: программирование GUI на С++

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Жасмин Бланшет, "QT 4: программирование GUI на С++" бесплатно, без регистрации.
Перейти на страницу:

01 void MailClient::writeSettings()

02 {

03 QSettings settings("Software Inc.", "Mail Client");

04 settings.beginGroup("mainWindow");

05 settings.setValue("size", size());

06 settings.setValue("mainSplitter", mainSplitter->saveState());

07 settings.setValue("rightSplitter", rightSplitter->saveState());

08 settings.endGroup();

09 }

Ниже приводится соответствующая функция по чтению настроек readSettings():

01 void MailClient::readSettings()

02 {

03 QSettings settings("Software Inc.", "Mail Client");

04 settings.beginGroup("mainWindow");

05 resize(settings.value("size", QSize(480, 360)).toSize());

06 mainSplitter->restoreState(

07 settings.value("mainSplitter").toByteArray());

08 rightSplitter->restoreState(

09 settings.value("rightSplitter").toByteArray());

10 settings.endGroup();

11 }

Разделитель QSplitter полностью поддерживается Qt Designer. Для размещения виджетов в разделителе поместите дочерние виджеты приблизительно в то место, где они должны находиться, выделите их и выберите пункт меню Form | Lay Out Horizontally in Splitter или Form | Lay Out Vertically in Splitter (Форма | Компоновка no roризонтали в разделитель или Форма | Компоновка по вертикали в разделитель).

Области с прокруткой

Класс QScrollArea содержит область отображения, которую можно прокручивать, и две полосы прокрутки. Если мы хотим добавить в виджет полосы прокрутки, значительно проще использовать класс QScrollArea, чем создавать свои собственные экземпляры QScrollBar и самим реализовывать функциональность скроллинга.

Рис. 6.11. Виджеты, составляющие область с прокруткой QScrollArea.

Способ применения QScrollArea состоит в следующем: вызывается функция setWidget() с виджетом, к которому мы хотим добавить полосы прокрутки. QScrollArea автоматически делает этот виджет дочерним (если он еще не является таковым) по отношению к области отображения (он доступен при помощи функции QScrollArea::viewport()). Например, если мы хотим иметь полосы прокрутки вокруг виджета IconEditor, который мы разработали в главе 5, мы можем написать такую программу:

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 IconEditor *iconEditor = new IconEditor;

05 iconEditor->setIconImage(QImage(":/images/mouse.png"));

06 QScrollArea scrollArea;

07 scrollArea.setWidget(iconEditor);

08 scrollArea.viewport()->setBackgroundRole(QPalette::Dark);

09 scrollArea.viewport()->setAutoFillBackground(true);

10 scrollArea.setWindowTitle(QObject::tr("Icon Editor"));

11 scrollArea.show();

12 return app.exec();

13 }

Рис. 6.12. Изменение размеров области с прокруткой QScrollArea.

QScrollArea при отображении виджета использует его текущий или идеальный размер, если размеры виджета еще ни разу не изменялись. Делая вызов setWidgetResizable(true), мы указываем QScrollArea на необходимость автоматического изменения размеров виджета, чтобы можно было воспользоваться любым дополнительным пространством за пределами его идеальных размеров.

По умолчанию полосы прокрутки видны на экране только в том случае, когда область отображения меньше дочернего виджета. Мы можем сделать полосы прокрутки постоянно видимыми при помощи установки следующих политик полос прокрутки:

scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

scrollArea.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

QScrollArea большую часть своей функциональности наследует от QAbstractScrollArea. Такие классы, как QTextEdit и QAbstractItemView (базовый класс для классов отображения элементов в Qt), являются производными от QAbstractScrollArea, поэтому нам не надо для них формировать оболочку из QScrollArea для получения полос прокрутки.

Прикрепляемые виджеты и панели инструментов

Прикрепляемыми являются виджеты, которые могут крепиться к определенным областям главного окна приложения QMainWindow или быть независимыми «плавающими» окнами. QMainWindow имеет четыре области крепления таких виджетов: одна сверху, одна снизу, одна слева и одна справа от центрального виджета. В таких приложениях, как Microsoft Visual Studio и Qt Linguist, широко используются прикрепляемые окна для обеспечения очень гибкого интерфейса пользователя. В Qt прикрепляемые виджеты представляют собой экземпляры класса QDockWidget.

Каждый прикрепляемый виджет имеет свой собственный заголовок, даже когда он прикреплен. Пользователи могут перемещать прикрепляемые окна с одного места крепления на другое, передвигая полосу заголовка. Они могут также отсоединять прикрепляемое окно от области крепления и сделать его независимым плавающим окном, располагая прикрепляемое окно вне областей крепления. Свободные плавающие прикрепляемые окна всегда находятся «поверх» их главного окна. Пользователи могут закрыть QDockWidget, щелкая по кнопке закрытия, расположенной в заголовке виджета. Любые комбинации этих возможностей можно отключать с помощью вызова QDockWidget::setFeatures().

Рис. 6.13. QMainWindow с прикрепленным виджетом.

В ранних версиях Qt панели инструментов рассматривались как прикрепляемые виджеты, использующие те же самые области крепления. Начиная с Qt 4 панели инструментов размещаются в собственных областях, расположенных по периметру центрального виджета (как показано на рис. 6.14), и они не могут открепляться. Если требуется иметь плавающую панель инструментов, можно просто поместить ее внутрь QDockWindow.

Рис. 6.14. Области крепления виджетов и области панелей инструментов QMainWindow.

Углы, обозначенные пунктирными линиями, могут принадлежать обеим соседним областям крепления. Например, мы могли бы верхний левый угол назначить левой области крепления с помощью вызова QMainWindow::setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea).

Следующий фрагмент программного кода показывает, как для существующего виджета (в данном случае для QTreeWidget) можно оформить оболочку в виде QDockWidget и вставить ее в правую область крепления:

QDockWidget *shapesDockWidget = new QDockWidget(tr("Shapes"));

shapesDockWidget->setWidget(treeWidget);

shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea

| Qt::RightDockWidgetArea);

addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget);

В вызове setAllowedAreas() задаются допустимые области крепления прикрепляемого окна. В нашем случае мы позволяем пользователю перетаскивать прикрепляемое окно только в левую или правую область крепления, где имеется достаточно пространства по вертикали для его нормального отображения. Если допустимые области не задаются явно, пользователь может перетаскивать прикрепляемое окно в любую из четырех областей.

Ниже приводится фрагмент из конструктора подкласса QMainWindow, который показывает, как можно создавать панель инструментов, содержащую QComboBox, QSpinBox и несколько кнопок QToolButton:

QToolBar *fontToolBar = new QToolBar(tr("Font"));

fontToolBar->addWidget(familyComboBox);

fontToolBar->addWidget(sizeSpinBox);

fontToolBar->addAction(boldAction);

fontToolBar->addAction(italicAction);

fontToolBar->addAction(underlineAction);

fontToolBar->setAllowedAreas(Qt::TopToolBarArea

| Qt::BottomToolBarArea);

addToolBar(fontToolBar);

Если мы хотим сохранять позиции всех прикрепляемых виджетов и панелей инструментов, чтобы иметь возможность их восстановления при следующем запуске приложения, мы можем написать почти такой же программный код, как для сохранения состояния разделителя QSplitter, используя функции класса QMainWindow saveState() и restoreState():

01 void MainWindow::writeSettings()

02 {

03 QSettings settings("Software Inc.", "Icon Editor");

04 settings.beginGroup("mainWindow");

05 settings.setValue("size", size());

06 settings.setValue("state", saveState());

07 settings.endGroup();

08 }


09 void MainWindow::readSettings()

10 {

11 QSettings settings("Software Inc.", "Icon Editor");

12 settings.beginGroup("mainWindow");

13 resize(settings.value("size").toSize());

14 restoreState(settings.value("state").toByteArray());

15 settings.endGroup();

16 }

Наконец, QMainWindow обеспечивает контекстное меню, в котором представлены все прикрепляемые окна и панели инструментов. Используя это меню, пользователь может закрывать и восстанавливать прикрепляемые окна и панели инструментов.

Рис. 6.15. Контекстное меню QMainWindow.

Многодокументный интерфейс

Приложения, которые обеспечивают работу со многими документами в центральной области главного окна, называются приложениями с многодокументным интерфейсом или MDI—приложениями. В Qt MDI—приложения создаются с использованием в качестве центрального виджета класса QWorkspace и путем представления каждого документа в виде дочернего окна QWorkspace.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*