Qt Quick Window 最小化事件
Qt Quick Window Minimize Event
我正在编写自己的桌面小部件作为练习。
我需要它始终保持在桌面上并禁用最小化。
window 是一个 Qt Quick ApplicationWindow
。我无法找到最小化时如何捕捉事件。例如,当我按下最小化所有 windows 按钮时,我只看到桌面,但我想让我的小部件保持未最小化状态。
我尝试在 QML 和 C++ 中使用信号,但没有成功。
有人可以帮忙吗?
您可以使用 Frameless Window,它将删除最小化、展开和关闭按钮。示例可用 here
Edit#1: 我已经 uploaded 代码 GitHub.
您可以安装事件过滤器来处理所需的事件。在这种情况下,您需要处理的事件是 QEvent::WindowStateChange
.
在您的主对象上安装事件过滤器。以下示例使用 QQmlApplicationEngine
,但您可以改用 QQuickView
。
想法是从 C++ 向您的 QML 应用程序发送一个信号并再次显示 window。 IE。通过调用 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);
}
}
我正在编写自己的桌面小部件作为练习。 我需要它始终保持在桌面上并禁用最小化。
window 是一个 Qt Quick ApplicationWindow
。我无法找到最小化时如何捕捉事件。例如,当我按下最小化所有 windows 按钮时,我只看到桌面,但我想让我的小部件保持未最小化状态。
我尝试在 QML 和 C++ 中使用信号,但没有成功。
有人可以帮忙吗?
您可以使用 Frameless Window,它将删除最小化、展开和关闭按钮。示例可用 here
Edit#1: 我已经 uploaded 代码 GitHub.
您可以安装事件过滤器来处理所需的事件。在这种情况下,您需要处理的事件是 QEvent::WindowStateChange
.
在您的主对象上安装事件过滤器。以下示例使用 QQmlApplicationEngine
,但您可以改用 QQuickView
。
想法是从 C++ 向您的 QML 应用程序发送一个信号并再次显示 window。 IE。通过调用 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);
}
}