Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Robotex от Февраль 04, 2011, 15:05



Название: Не реагировать на мышь.
Отправлено: Robotex от Февраль 04, 2011, 15:05
Как заставить Qt4 приложение вообще не реагировать на мышь? Т.е. чтобы оно только отрисовывалось. Если под окном кнопка другого приложения и пользователь кликнет, то нажмется именно та кнопка.


Название: Re: Не реагировать на мышь.
Отправлено: Пантер от Февраль 04, 2011, 15:07
На сколько я знаю, средствами Qt это не решить.


Название: Re: Не реагировать на мышь.
Отправлено: Robotex от Февраль 04, 2011, 15:19
В SIM IM есть плагин OSD. Так в нем как-то не реагирует окно (ну разве что на текст, а вот между буквами нет). Но это на qt3, а в четвертой версии как.


Название: Re: Не реагировать на мышь.
Отправлено: SABROG от Февраль 05, 2011, 14:50
Вот вариант для Windows 2000 и выше с использованием WinAPI

widget.h
Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
 
namespace Ui {
   class Widget;
}
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   explicit Widget(QWidget* parent = 0);
   ~Widget();
 
Q_INVOKABLE void callAfterStartEventLoop();
 
private:
   Ui::Widget* ui;
};
 
#endif // WIDGET_H
 
 

widget.cpp
Код
C++ (Qt)
#define WINVER 0x0502
#define WIN32_LEAN_AND_MEAN
#define NOCOMM
#include <windows.h>
 
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget* parent) :
       QWidget(parent, Qt::WindowStaysOnTopHint),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
   QMetaObject::invokeMethod(this, "callAfterStartEventLoop", Qt::QueuedConnection);
}
 
Widget::~Widget()
{
}
 
void Widget::callAfterStartEventLoop()
{
#if defined(Q_WS_WIN)
   HWND hWnd = effectiveWinId();
   SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT);
   SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
#endif
}
 


Название: Re: Не реагировать на мышь.
Отправлено: panAlexey от Февраль 06, 2011, 14:33
Как заставить Qt4 приложение вообще не реагировать на мышь? Т.е. чтобы оно только отрисовывалось. Если под окном кнопка другого приложения и пользователь кликнет, то нажмется именно та кнопка.
Эвент луп?


Название: Re: Не реагировать на мышь.
Отправлено: sadhu от Февраль 06, 2011, 22:32
попробуй рекурсивно всем виджетам установить атрибут Qt::WA_TransparentForMouseEvents


Название: Re: Не реагировать на мышь.
Отправлено: sus от Февраль 07, 2011, 04:07
Буквально пару дней назад делал подобное. Суть заключается в том, чтобы в окне пробивать дырку в 1 пиксель под курсором мыши. Такой вариант будет работать, но возможны косяки, если окно повиснет.