Пишем «плавающее» окно на qt. Часть 2. Часы и меню.
В этой части мы добавим контекстное меню для нашего «плавающего» окна и заставим часы идти. Если у вас нет готового проекта с предыдущего урока, вы можете скачать его с GitFlick
Заставляем часы идти
Для начала нам надо получить текущее время в виде строки.
Для этого в floatwindow.cpp в конец метода FloatWindow::FloatWindow(QWidget *parent) добавим
ui->clockLabel->setText(QTime::currentTime().toString());
Добавим в начало файла
#include <QTime>
Запустим сборку проекта и получим следующее:
Теперь нам нужно заставить таймер обновлять это значение раз в секунду
Для этого нажмем F4 и добавим
QTimer *clockTimer;
после
QPoint oldPos;
Небольшое отступление.
Если при сборке вы можете получить подобную ошибку:
floatwindow.cpp:17: error: invalid use of incomplete type 'class QTimer'
| clockTimer = new QTimer()
Ошибка означает, что вы забыли добавить include с объявлением класса QTimer. Можно добавить его вручную, а можно правой кнопкой щелкнуть по QTimer в окне редактора, в меню выбрать Refactor и далее выбрать Add #include <QTimer>
Вот и всё, такой подход помогает экономить много времени.
Вернемся к нашему коду.
Добавим
private slots:
void updateTimer();
перед
};
#endif // FLOATWINDOW_H
Таким образом мы объявим слот для нашего таймера.
Нажмем F4 еще раз и добавим в конец метода FloatWindow::FloatWindow(QWidget *parent)
clockTimer = new QTimer();
clockTimer->setInterval(1000);
clockTimer->start();
connect(clockTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));
В самый конец файла добавим
void FloatWindow::updateTimer()
{
ui->clockLabel->setText(QTime::currentTime().toString());
}
Соберем и запустим проект у нас получились идущие часы!
Добавляем контекстное меню
У нас есть идущие часы, но вы должно быть заметили, что закрытие главной формы не приводит к выходу из программы. Плавающее окно остается на экране и удалить его можно, только принудительно «убив» программу через диспетчер задач.
Давайте это исправим - добавим контекстное меню с пунктом для выхода.
В floatwindow.cpp в конец метода FloatWindow::FloatWindow(QWidget *parent) добавим:
quitAct = new QAction(tr("Quit"), this);
conextMenu = new QMenu(this);
connect(quitAct, &QAction::triggered, this, &FloatWindow::onQuitAction);
в конец файла добавим:
void FloatWindow::onQuitAction()
{
exit(0);
}
void FloatWindow::contextMenuEvent(QContextMenuEvent *event)
{
conextMenu->addAction(quitAct);
conextMenu->exec(event->globalPos());
}
Нажмем F4.
В private: добавим
QAction *quitAct;
QMenu *conextMenu;
В protected:
#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) override;
#endif // QT_NO_CONTEXTMENU
В private slots:
void onQuitAction();
Запустим сборку проекта и щелкнем правой кнопкой мыши по нашим часам. Откроется меню:
Нажмем Quit и программа закроется.
Заключение
Подведем итоги, мы узнали:
Как получить текущее время в виде строки с помощью Qt;
Как обновить текст компонента QLabel;
Как добавить таймер к компоненту QWidget и использовать его;
Как добавить контекстное меню для QWidget;
Как добавить пункт к контекстному меню;
Как реализовать взаимодействие с пунктом меню.
В следующей статье мы улучшим внешний вид контекстного меню, добавив к нему заголовок, а также реализуем механизм, позволяющий сохранять последнее положение нашего «плавающего» окна после выхода из программы и загрузку его, после повторного запуска.
Добавить комментарий