Пишем «плавающее» окно на qt5. Часть 2. Часы и меню. - АлтунинВВ.Блог - всё об IT-технологиях!
Суббота, 07 марта 2020 21:14

Пишем «плавающее» окно на qt5. Часть 2. Часы и меню.

Россия

Это вторая часть, первую часть вы можете найти на моем сайте.

В этой части мы добавим контекстное меню для нашего «плавающего» окна и заставим часы идти.

Если у вас нет готового проекта с предыдущего урока, вы можете скачать его с github.com.

Заставляем часы идти

Для начала нам надо получить текущее время в виде строки.

Для этого в 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 и добавим

 
QAction *quitAct;
QMenu *conextMenu;
 

В private:

Добавим

 
#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) override;
#endif // QT_NO_CONTEXTMENU
 

В protected:

Добавим

void onQuitAction();

в

private slots:

Запустим сборку проекта и щелкнем правой кнопкой мыши по нашим часам. Откроется меню:

Нажмем Quit и программа закроется.

Заключение

Подведем итоги, мы узнали:

  1. Как получить текущее время в виде строки с помощью Qt5

  2. Как обновить текст компонента QLabel

  3. Как добавить таймер к компоненту QWidget и использовать его

  4. Как добавить контекстное меню для QWidget

  5. Как добавить пункт к контекстному меню

  6. Как реализовать взаимодействие с пунктом меню

Вот и всё на сегодня. В следующем материале мы улучшим внешний вид контекстного меню, добавив к нему заголовок, а также реализуем механизм, позволяющий сохранять последнее положение нашего «плавающего» окна после выхода из программы и загрузку его, после повторного запуска.

Готовый проект вы можете найти на github по ссылке.

Прочитано 450 раз Последнее изменение Понедельник, 23 марта 2020 17:29