Благодаря @ кунифу Я нашел решение. Поэтому для прослушивания сообщений Windows вам нужно добавить свой EventFilter , унаследовав QAbstractNativeEventFilter , например:
#include <QAbstractNativeEventFilter>
#include <QObject>
class DeviceEventFilter : public QObject, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
DeviceEventFilter();
bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override;
signals:
void serialDeviceChanged();
};
и отфильтровать нужное вам сообщение WM_DEVICECHANGE:
#include <windows.h>
#include <dbt.h>
bool DeviceEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *) {
if (eventType == "windows_generic_MSG") {
MSG *msg = static_cast<MSG *>(message);
if (msg->message == WM_DEVICECHANGE) {
if (msg->wParam == DBT_DEVICEARRIVAL || msg->wParam == DBT_DEVICEREMOVECOMPLETE) {
// connect to this signal to reread available ports or devices etc
emit serialDeviceChanged();
}
}
}
return false;
}
И где-нибудь в вашем коде, где у вас есть доступ к DeviceEventFilter
объекту, добавьте эту строку:
qApp->installNativeEventFilter(&devEventFilterObj);
Или в main.cpp
:
QApplication app(argc, argv);
app.installNativeEventFilter(&devEventFilterObj);
Вся благодарность @ кунифу !