Russian Qt Forum
Ноябрь 15, 2024, 11:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать виджет, сквозь который можно кликать мышкой?  (Прочитано 8992 раз)
k06a
Гость
« : Август 28, 2009, 15:32 »

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

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

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

Qt 4.5.2(static linked), msvc-2005, Windows XP SP3 (home)
« Последнее редактирование: Сентябрь 03, 2009, 21:09 от k06a » Записан
Winstrol
Гость
« Ответ #1 : Август 28, 2009, 15:48 »

examples/widgets/shapedclock?
Записан
k06a
Гость
« Ответ #2 : Август 28, 2009, 15:58 »

examples/widgets/shapedclock?

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

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

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Август 28, 2009, 16:01 »

Зачем тебе это? И что будет под этим виджетом? просто рабочий стол?
Записан
k06a
Гость
« Ответ #4 : Август 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);

Осталось указать пустой регион и всего делов.
Пробую. Спасибо.
Записан
k06a
Гость
« Ответ #5 : Август 28, 2009, 16:15 »

Зачем тебе это? И что будет под этим виджетом? просто рабочий стол?

Например, это может быть монитор трафика/RAM/HDD . . .
Если он будет прозрачен и неприкасаем для - он считай не занимает на экране места.
Записан
k06a
Гость
« Ответ #6 : Август 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);

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

Нет. Это совсем не то)))
Рисуется только часть под маской.
Я таким образом сделал виджет невдимым.
А он должен быть видим, но не хватаем . . .
Записан
SASA
Гость
« Ответ #7 : Август 28, 2009, 19:12 »

посмотри
http://www.prog.org.ru/index.php?topic=7303
Записан
k06a
Гость
« Ответ #8 : Август 29, 2009, 23:37 »


Описанным там способом, можно только виджеты одного приложения уведомлять . . .
А мне нужно чтобы можно было все окна системы трогать сквозь мой виджет . . .
Записан
SASA
Гость
« Ответ #9 : Август 31, 2009, 15:02 »

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

Способ есть. Каждый раз пробивать под курсором дырку в один пиксель. Дырку пробиваем с помощь setMask. Этот способ используют сами троли (я его увидел в исходниках Qt). Проблемы - это вид курсора и нижнему окошку будет постаянно приходить мауслив.
Возможно эти проблемы решаемые.

Не могли бы вы подробнее указать, где именно вы такое видели.
Хотелось бы взглянуть на реализацию по-ближе . . .
Записан
SASA
Гость
« Ответ #11 : Сентябрь 01, 2009, 16:17 »

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

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

P.S. Лучше обращаться ко мне на ты.
Записан
k06a
Гость
« Ответ #12 : Сентябрь 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);
}
};
Записан
k06a
Гость
« Ответ #13 : Сентябрь 02, 2009, 01:08 »

Лучше вот такое условие:
Код
C++ (Qt)
if ((ev->type() == QEvent::MouseMove) ||
(ev->type() == QEvent::MouseButtonPress) ||
(ev->type() == QEvent::MouseButtonRelease) ||
(ev->type() == QEvent::MouseButtonDblClick) )
{
...
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.274 секунд. Запросов: 23.