Qt Quick Window Минимизировать событие

Я пишу свой собственный виджет рабочего стола на практике. Мне нужно, чтобы он всегда оставался на рабочем столе и отключал минимизацию.

Окно Qt Quick ApplicationWindow, Я не могу узнать, как ловить события, когда они минимизированы. Например, когда я нажимаю кнопку свертывания всех окон, я вижу только рабочий стол, но хочу, чтобы мой виджет оставался не минимизированным.

Я пытался использовать сигналы как в QML, так и в C++, но безуспешно.

Кто-нибудь может помочь?

2 ответа

Решение

Редактирование #1: я загрузил код на GitHub.

Вы можете установить фильтр событий для обработки требуемого события. В этом случае событие, которое вам нужно обработать, QEvent::WindowStateChange,

Установите фильтр событий на ваш главный объект. В следующем примере используется QQmlApplicationEngine но вы могли бы использовать QQuickView вместо.

Идея состоит в том, чтобы отправить сигнал из C++ в ваше приложение QML и снова показать окно. То есть позвонив show() метод.

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include "myeventfilter.h"

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

    MyEventFilter filter;

    QQmlApplicationEngine engine;
    app.installEventFilter(&filter);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject::connect(&filter,
                     SIGNAL(windowStateChange()),
                     engine.rootObjects().takeFirst(),
                     SLOT(windowStateChange()));

    return app.exec();
}

main.qml

import QtQuick 2.1
import QtQuick.Window 2.0
import QtQuick.Controls 2.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    function windowStateChange()
    {
        console.log("qml slot - windowStateChange");
        show();
    }
}

myeventfilter.h

#ifndef MYEVENTFILTER_H
#define MYEVENTFILTER_H

#include <QObject>

class MyEventFilter : public QObject
{
    Q_OBJECT

public:
    explicit MyEventFilter(QObject *parent = 0);

protected:
     bool eventFilter(QObject *obj, QEvent *event);

signals:
  void windowStateChange();
};

#endif // MYEVENTFILTER_H

myeventfilter.cpp

#include "myeventfilter.h"
#include <QEvent>
#include <QDebug>

MyEventFilter::MyEventFilter(QObject *parent) :
    QObject(parent)
{
}

bool MyEventFilter::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Close)
    {
        qDebug() << Q_FUNC_INFO << " QEvent::Close ";
        return false;
    } else if (event->type() == QEvent::WindowStateChange)
    {
        qDebug() << Q_FUNC_INFO << " QEvent::WindowStateChange ";
        emit windowStateChange();
        return true;
    } else
    {
        return QObject::eventFilter(obj, event);
    }
}

Вы можете использовать Безрамное Окно, которое удалит кнопки свертывания, расширения и закрытия. Пример доступен здесь

Другие вопросы по тегам