Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: k06a от Август 28, 2009, 15:32



Название: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 28, 2009, 15:32
Нужно сделать полупрозрачный виждет, чтобы клики мышки проходили сквозь него.

1) setAttribute(Qt::WA_TransparentForMouseEvents);
Не помогло. Мышь всё-равно в него тыкается.
Или это только у меня такая проблема?

2) Виджет QRubberBand у мня также не сквозной.
Или так только у меня?

Qt 4.5.2(static linked), msvc-2005, Windows XP SP3 (home)


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: Winstrol от Август 28, 2009, 15:48
examples/widgets/shapedclock?


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 28, 2009, 15:58
examples/widgets/shapedclock?

В этом пример виджет круглой формы.
Но он реагирует на мышь. Его можно таскать по экрану.

Мне нужен виджет поверх всех окон и пропускающий сквозь себя мышку.
То есть мышка не может с ним взаимодействовать.


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: ecspertiza от Август 28, 2009, 16:01
Зачем тебе это? И что будет под этим виджетом? просто рабочий стол?


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 28, 2009, 16:09
examples/widgets/shapedclock?

Вот нашёл в коде:
Код
C++ (Qt)
int side = qMin(width(), height());
QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                              side, QRegion::Ellipse);
setMask(maskedRegion);

Осталось указать пустой регион и всего делов.
Пробую. Спасибо.


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 28, 2009, 16:15
Зачем тебе это? И что будет под этим виджетом? просто рабочий стол?

Например, это может быть монитор трафика/RAM/HDD . . .
Если он будет прозрачен и неприкасаем для - он считай не занимает на экране места.


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 28, 2009, 16:28
examples/widgets/shapedclock?

Вот нашёл в коде:
Код
C++ (Qt)
int side = qMin(width(), height());
QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                              side, QRegion::Ellipse);
setMask(maskedRegion);

Осталось указать пустой регион и всего делов.
Пробую. Спасибо.

Нет. Это совсем не то)))
Рисуется только часть под маской.
Я таким образом сделал виджет невдимым.
А он должен быть видим, но не хватаем . . .


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: SASA от Август 28, 2009, 19:12
посмотри
http://www.prog.org.ru/index.php?topic=7303 (http://www.prog.org.ru/index.php?topic=7303)


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 29, 2009, 23:37
посмотри
http://www.prog.org.ru/index.php?topic=7303 (http://www.prog.org.ru/index.php?topic=7303)

Описанным там способом, можно только виджеты одного приложения уведомлять . . .
А мне нужно чтобы можно было все окна системы трогать сквозь мой виджет . . .


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: SASA от Август 31, 2009, 15:02
Способ есть. Каждый раз пробивать под курсором дырку в один пиксель. Дырку пробиваем с помощь setMask. Этот способ используют сами троли (я его увидел в исходниках Qt). Проблемы - это вид курсора и нижнему окошку будет постаянно приходить мауслив.
Возможно эти проблемы решаемые.


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Август 31, 2009, 22:34
Способ есть. Каждый раз пробивать под курсором дырку в один пиксель. Дырку пробиваем с помощь setMask. Этот способ используют сами троли (я его увидел в исходниках Qt). Проблемы - это вид курсора и нижнему окошку будет постаянно приходить мауслив.
Возможно эти проблемы решаемые.

Не могли бы вы подробнее указать, где именно вы такое видели.
Хотелось бы взглянуть на реализацию по-ближе . . .


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: SASA от Сентябрь 01, 2009, 16:17
Не могли бы вы подробнее указать, где именно вы такое видели.
Хотелось бы взглянуть на реализацию по-ближе . . .

QTDIR\src\gui\kernel\qapplication.cpp
функция
QWidget *QApplication::widgetAt(const QPoint &p)

P.S. Лучше обращаться ко мне на ты.


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Сентябрь 02, 2009, 00:46
SASA, огромное спасибо тебе!!!

Ниже приведу код класса. Теперь имеется полупрозрачный виджет, сквозь который можно работать мышкой. Таскать иконки у меня не получилось (можно для этого пробивать дырку побольше), но кликается по всему нормально. И даже вид курсора зависит от элемента под ним.

Код
C++ (Qt)
class QUntouchable : public QRubberBand
{
Q_OBJECT
 
public:
QUntouchable(QRubberBand::Shape shape, QWidget *parent = NULL)
: QRubberBand(shape, parent)
{
setMouseTracking(true);
}
 
~QUntouchable() {}
 
bool QUntouchable::event(QEvent *ev)
{
if (ev->type() == QEvent::MouseMove)
{
QMouseEvent *mev = (QMouseEvent*)ev;
QRegion newmask = QRegion(this->rect()) - QRegion(mev->x(), mev->y(), 1, 1);
setMask(newmask);
}
return QWidget::event(ev);
}
};


Название: Re: Как сделать виджет, сквозь который можно кликать мышкой?
Отправлено: k06a от Сентябрь 02, 2009, 01:08
Лучше вот такое условие:
Код
C++ (Qt)
if ((ev->type() == QEvent::MouseMove) ||
(ev->type() == QEvent::MouseButtonPress) ||
(ev->type() == QEvent::MouseButtonRelease) ||
(ev->type() == QEvent::MouseButtonDblClick) )
{
...
}