Программирование на C++ с использованием библиотеки Qt4


Меню и строка состояния (файл examples-qt/02/02.cpp)


1 #include <QtGui>
2 #include "02.h" 3 4 MainWindow::MainWindow() { 5 6 QTextCodec *codec = QTextCodec::codecForName("CP1251");
7 QTextCodec::setCodecForTr(codec);
8 9 aboutAction = new QAction(tr("&О программе"), this);
10 aboutAction->
setStatusTip(tr("Сведения о программе"));
11 connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));
12 13 exitAction = new QAction(tr("В&ыход"), this);
14 exitAction->
setStatusTip(tr("Выход из программы"));
15 exitAction->
setShortcut(tr("Ctrl+Q"));
16 connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
17 18 fileMenu = menuBar()->
addMenu(tr("&Файл"));
19 fileMenu->
addAction(aboutAction);
20 fileMenu->
addSeparator();
21 fileMenu->
addAction(exitAction);
22 23 sb1 = new QLabel(statusBar());
24 sb2 = new QLabel(statusBar());
25 sb3 = new QLabel(statusBar());
26 27 statusBar()->
setSizeGripEnabled(false);
28 statusBar()->
addWidget(sb1, 2);
29 statusBar()->
addWidget(sb2, 1);
30 statusBar()->
addWidget(sb3, 1);
31 32 sb1->
setText(tr("Привет!"));
33 34 setMouseTracking(true);
35 } 36 37 38 void MainWindow::resizeEvent(QResizeEvent *event) { 39 QSize sz = event->
size();
40 sb2->
setText( 41 QString( "(%1, %2)" ).arg( sz.width() ).arg( sz.height() ) );
42 } 43 44 void MainWindow::mouseMoveEvent(QMouseEvent *event) { 45 QPoint pos = event->
pos();
46 sb3->
setText( 47 QString( "%1, %2" ).arg( pos.x() ).arg( pos.y() ) );
48 } 49 50 void MainWindow::about() { 51 QMessageBox::about( 52 this, tr("О программе"), 53 tr("<h2>
Простое приложение Qt4</h2>
" 54 "<p>
Окно с меню и строкой состояния"));
55 } 56 57 bool MainWindow::askOnClose() { 58 int r = QMessageBox::question( 59 this, tr("Подтвердите"), 60 tr("Выйти из программы?"), 61 QMessageBox::Yes | QMessageBox::No, 62 QMessageBox::Yes, 63 QMessageBox::Cancel | QMessageBox::Escape);
64 return (r == QMessageBox::Yes);
65 } 66 67 void MainWindow::closeEvent(QCloseEvent *event) { 68 if (askOnClose()) { 69 event->
accept();
70 } else { 71 event->
ignore();
72 } 73 } 74 75 int main(int argc, char *argv[]) { 76 QApplication app(argc, argv);
77 MainWindow mainWin; 78 mainWin.show();
79 return app.exec();
80 }


  • (1-2) Подключили модуль QtGui и свой заголовочный файл.
  • (4-35) Конструктор главного окна.
  • (6-7) Определили кодек.
  • (9-11) Создали действие "О программе", задали для него текст подсказки и связали с функцией about, реализованной ниже.
  • (13-16) Создали действие "Выход", задали для него текст подсказки и клавиатурное сокращение, связали его с функцией close, выполняющей закрытие окна (эта функция определена в базовом классе).
  • (18-21) Создали меню "Файл", состоящее из двух пунктов, с разделителем между ними.
  • (23-25) Создали три текстовые метки, в качестве родительского элемента указали строку состояния.
  • (27-30) Убрали из строки состояния маркер для изменения размеров окна (иначе правая текстовая метка не доходит до правого края окна, что выглядит не слишком эстетично) и разместили в строке три текстовые метки. Указали для первой коэффициент растяжимости, в два раза больший, чем для остальных.
  • (32) Вывели в первое поле строки состояния приветствие.
  • (34)Указали, что метод mouseMoveEvent будет вызываться при движении указателя мыши, даже если её кнопки не нажаты.
  • (38-42) Виртуальный метод, выполняемый при изменении размеров окна. Узнаём новые размеры с помощью функции QResizeEvent::size() и выводим их во второе поле строки состояния. Для преобразования целых значений к типу QString используем метасимволы %1 и %2 в строке шаблона (41), а также функцию QString::arg, которая замещает их строковым представлением своего аргумента и возвращает результат типа QString.
  • (44-48) Виртуальный метод, вызываемый при перемещении указателя мыши. Новые координаты указателя возвращает функция QMouseeEvent::pos(). Мы выводим их в третье поле строки состояния.
  • (50-55) Функция about выполняется при выборе пункта меню Файл | О программе. Для вывода на экран информации используется метод about, определённый для класса QMessageBox. Обратите внимание, что для форматирования текста используется язык разметки HTML.
  • (57-73) При закрытии окна программы (по команде меню Выход, нажатием комбинации клавиш Alt+F4 или с помощью крестика в верхнем правом углу окна) исполняется виртуальный метод closeEvent (67), в котором мы вызываем функцию askOnClose (57). Последняя выводит на экран запрос на подтверждение, используя метод question класса QMessageBox. Если пользователь отвечает утвердительно, то окно зарывается (69), иначе действие отменяется (71) и выполнение программы продолжается.


  • Чуть позже мы узнаем, как использовать программу


    Содержание раздела