qtbindings icon indicating copy to clipboard operation
qtbindings copied to clipboard

QWidget::winEvent equivalent for qtbindings?

Open casper opened this issue 4 years ago • 1 comments

Does anyone know if QWidget::winEvent() or QApplication::winEventFilter() is somehow available on qtbindings?

I would like to do my own event processing in order to capture WM_COPYDATA for some simpe Windows IPC. I found some sample code for Qt C++ here:

https://stackoverflow.com/questions/1755196/receive-wm-copydata-messages-in-a-qt-app

I tried searching for winEvent and winEventFilter in the qtbindings source, but could not find anything. Are these methods missing or how to access them through Ruby?

casper avatar Dec 16 '21 14:12 casper

https://stackoverflow.com/q/14610426/8740349

Qt5 replaced winEvent with nativeEvent.

Example

Imagine you need to be Qt 4 compatible, and your Window has some transparent parts, which you need to be click-through:

Header:

#ifndef MY_CLASS_H
#define MY_CLASS_H

#include <QtCore/QByteArray>
#include <QWidget>

class MyClass : public QWidget {
    typedef QWidget super;
public:

    // ...

protected:

#if defined(_WIN32)
#  if QT_VERSION_MAJOR >= 5
    bool nativeEvent(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
#  else
    bool winEvent(MSG *message, long *result) Q_DECL_OVERRIDE;
#  endif
#endif

private:
    Q_DISABLE_COPY(MyClass)
};

#endif // MY_CLASS_H

Source:

#include "my-class.h"

#include <QPoint>

#ifdef _WIN32
#   include <Windows.h>
#   include <windowsx.h>
#endif


#if defined(_WIN32)
#  if QT_VERSION_MAJOR >= 5
bool MyClass::nativeEvent(const QByteArray &eventType, void *messageVoid, long *result)
{
    if (eventType == "windows_generic_MSG")
    {
        MSG *message = reinterpret_cast<MSG *>(messageVoid);

#  else

bool MyClass::winEvent(MSG *message, long *result)
{
    {
#  endif // QT_VERSION_MAJOR

        if (message->message == WM_NCHITTEST) {
            QPoint pos = this->mapFromGlobal(QPoint(GET_X_LPARAM(message->lParam), GET_Y_LPARAM(message->lParam)));

            if ( ! contentsRect().contains(pos)) {
                *result = HTTRANSPARENT;
                return true; // Stops further processing.
            }
        }

    }
#  if QT_VERSION_MAJOR >= 5
    return super::nativeEvent(eventType, messageVoid, result);
#  else
    return super::winEvent(message, result);
#  endif // QT_VERSION_MAJOR

}
#endif // _WIN32

Note that Qt5 defines Q_OS_WIN and Qt4 defines Q_WS_WIN hence above uses _WIN32.

top-master avatar Feb 15 '24 11:02 top-master