Arhlit - информационные технологии

Получить событие или уведомление, когда пользователь щелкает значок на панели задач/док-станции в приложении Qt

Я разрабатываю приложение в osx, windows, linux

Я хочу сделать функцию, как скайп. когда пользователь нажимает закрыть окна, приложение не закрывается, а скрывается. Когда пользователь щелкает значок приложения на док-станции или панели задач, мое главное окно снова открывается.

Как получить уведомления или фильтровать события, когда пользователь нажимает на значок приложения?

10.04.2014

Ответы:


1

Во-первых, вам нужно предотвратить закрытие окна вашего приложения, когда вы нажимаете кнопку «закрыть окно». Предполагая, что вы используете QMainWindow:

class MainWindow : public QMainWindow
{
    // .. constructors, etc.
    // ..
protected:
    void closeEvent(QCloseEvent *)
    {
        // Do not close, but hide the window.
        hide();
    }
};

В Qt есть специальный класс для обработки значков на панели задач — QSystemTrayIcon. Итак, простое приложение будет выглядеть так:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow mw;
    QSystemTrayIcon tray; // needs an icon.

    // Show the main window when user activates the tray icon.
    QObject::connect(&tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
                     &mw, SLOT(show()));
    tray.show();

    return app.exec();
}
10.04.2014
  • спасибо, ваханчо, я обнаружил, что использую lower() вместо close(), потому что мое приложение может повторно активироваться, когда пользователь щелкает его на панели задач. Но QSystemTrayIcon предоставляет новую функцию для моего приложения. благодарю вас 10.04.2014
  • Вы неправильно используете closeEvent. Этот метод просто уведомляет вас о том, что окно будет закрыто, вы не можете переопределить это действие. Если вы хотите предотвратить закрытие окна, вы должны переопределить метод event. Для событий, которые вы хотите удалить, верните true и не вызывайте метод event базового класса. 10.04.2014
  • @KubaOber, использование правильное, и я могу его переопределить. Даже в документах говорится: вы можете переопределить эту функцию, чтобы изменить способ, которым виджет отвечает на запросы закрытия окна. Например, вы можете предотвратить закрытие окна, вызывая ignore() для всех событий. 10.04.2014
  • @vahancho Ах, ты прав, я забыл про ignore. Но ты его не звал, а ты должен! Это достигает того же, что и повторная реализация event. 10.04.2014
  • Это может работать в Windows и Linux (не знаю), но на Mac значок док-станции отличается от значка на панели задач (также известного как виджет строки меню). Когда я пробую это на Mac, это не работает при нажатии на значок дока. 27.02.2015

  • 2

    Это должно быть полезно:

     void setQuitOnLastWindowClosed(bool quit)
    
    10.04.2014
    Новые материалы

    12 сайтов с искусственным интеллектом, которые поразят вас
    Приготовьтесь поразить воображение Сегодня существует несколько веб-сайтов, использующих искусственный интеллект (ИИ). От индивидуальных рекомендаций по новостям до более умных поисковых..

    Скрытый технический долг в системах машинного обучения [NeurIPS 2015]
    Что такое технический долг? Технический долг — это метафора, введенная Уордом Каннингемом в 1992 году, чтобы объяснить долгосрочные затраты, связанные с быстрым продвижением в разработке..

    Алгоритм быстрой сортировки в Python
    Всем привет, добро пожаловать на programminginpython.com . Здесь я покажу вам, как реализовать алгоритм быстрой сортировки в Python. В предыдущих статьях я рассмотрел Сортировку вставкой ,..

    Как использовать манипулирование объектами в JavaScript
    Объекты являются важным строительным блоком JavaScript. Они позволяют группировать свойства и методы вместе. Объект представляет собой набор свойств. Свойства идентифицируются с..

    Разработка игр с помощью Godot Engine: мощный инструмент с открытым исходным кодом
    Разработка игр — творческий и сложный процесс, требующий множества навыков и инструментов. Одним из наиболее важных инструментов является игровой движок, который представляет собой программную..

    От XML к аннотациям: переход к современной конфигурации Spring
    Введение Фреймворк Spring претерпел значительную эволюцию с момента своего создания. Одним из заметных изменений стал переход от конфигураций на основе XML к конфигурациям, управляемым..

    Я люблю Руби!
    Я люблю Руби! Мне это нравится по той же причине, по которой мне нравится программировать на Python. Он настолько интуитивно понятен, а встроенные методы упрощают решение проблем. Если вы..