【问题标题】:Qt Quick Window Minimize EventQt 快速窗口最小化事件
【发布时间】:2017-01-24 04:20:25
【问题描述】:

我正在编写自己的桌面小部件作为练习。 我需要它始终保持在桌面上并禁用最小化。

窗口是 Qt Quick ApplicationWindow。我不知道如何在事件最小化时捕获事件。例如,当我按下最小化所有窗口按钮时,我只能看到桌面,但我想让我的小部件保持最小化。

我尝试在 QML 和 C++ 中使用信号,但没有成功。

谁能帮忙?

【问题讨论】:

  • 您需要将代码发布为最少且完整的示例。那是什么术语?你想要的肯定是可行的。

标签: qt qml qt-quick


【解决方案1】:

编辑#1:我已将代码 uploaded 发送到 GitHub。

您可以安装一个事件过滤器来处理所需的事件。在这种情况下,您需要处理的事件是QEvent::WindowStateChange

在您的主要对象上安装事件过滤器。以下示例使用QQmlApplicationEngine,但您可以改用QQuickView

这个想法是从 C++ 向您的 QML 应用程序发送一个信号并再次显示该窗口。 IE。通过调用show() 方法。

ma​​in.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();
}

ma​​in.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);
    }
}

【讨论】:

    【解决方案2】:

    您可以使用无框窗口来删除最小化、展开和关闭按钮。示例可用here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多