Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прохождение сообщений сквозь окна. 
:(
    Опции темы
OlegIT
Дата 10.6.2019, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Решил я свою проблему по сглаживанию с помощью QWindow. Но теперь возникла другая проблема, сообщение от действий мыши «застревают» в QWindow и не доходят до родительского QWidget. Как «пропихнуть» эти сообщения?

PM MAIL   Вверх
kapbepucm
Дата 11.6.2019, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Переопределить обработчик(-и) событий мыши (набросок кода не использовать в боевых условиях smile )
Код
#include <iostream>
#include <QApplication>
#include <QWidget>


class Child: public QWidget
{
public:
  Child(QWidget* parent): QWidget(parent)
  {
    setGeometry(30, 30, 300, 300);
    setStyleSheet("border:3px solid rgb(0, 0, 0);");
  }
protected:
  void mousePressEvent(QMouseEvent* event);
};


class Parent: public QWidget
{
private:
  Child* child;
public:
  Parent(QWidget* parent): QWidget(parent)
  {
    setGeometry(100, 100, 700, 500);
    child = new Child(this);
    child->show();
  }
  void mousePressEvent(QMouseEvent*)
  {
    std::cout << "parent pressed\n";
  }
};

void Child::mousePressEvent(QMouseEvent* event)
{
  std::cout << "child pressed\n";
  ((Parent*)parent())->mousePressEvent(event);
}


int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  Parent parent(nullptr);
  parent.show();
  return app.exec();
}


Добавлено через 12 минут и 26 секунд
Ещё вариант, использовать Qt-шный механизм signal-slot. QObject::connect сигнал мыши в QWindow, слот обработчик мыши в QWidget.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
OlegIT
Дата 11.6.2019, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Скорей всего signal-slot поможет, но только не в прямую, обработчики мыши не сигнальные.
А что, штатно ни как?
Честно говоря по первому варианту не понял, там же QWindow хитрым образом к QWidget подключается. Впечатление, что это просто заплатка.
PM MAIL   Вверх
kapbepucm
Дата 12.6.2019, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(OlegIT @  11.6.2019,  15:50 Найти цитируемый пост)
обработчики мыши не сигнальные
пример:
Код
#include <iostream>
#include <QApplication>
#include <QWidget>
#include <QWindow>
#include <QMouseEvent>
#include <QScreen>

class Child: public QWindow
{
  Q_OBJECT
public:
  Child(QScreen *targetScreen = nullptr): QWindow(targetScreen)
  {}
  void mousePressEvent(QMouseEvent* event)
  {
    emit clicked(event);
  }
signals:
  void clicked(QMouseEvent* event);
};


class Parent: public QWidget
{
private:
  Child*   childWindow;
  QWidget* childWidget;
public:
  Parent(QWidget* parent): QWidget(parent)
  {
    setGeometry(100, 100, 700, 500);
    childWindow = new Child();
    childWidget = createWindowContainer(childWindow, this);
    childWidget->setGeometry(30, 30, 300, 300);
    connect(childWindow, &Child::clicked, this, &Parent::mousePressEvent);
  }
  void mousePressEvent(QMouseEvent*)
  {
    std::cout << "parent pressed\n";
  }
};

int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  Parent parent(nullptr);
  parent.show();
  return app.exec();
}
#include "test.moc"


Цитата(OlegIT @  11.6.2019,  15:50 Найти цитируемый пост)
хитрым образом
суть в том, что в обработчике дочки вызывается обработчик родителя (правда, в нормальных условиях дочка его не должна видеть)

Цитата(OlegIT @  10.6.2019,  14:49 Найти цитируемый пост)
 до родительского QWidget
вроде как QWidget не должен быть родителем для QWindow: не совсем совместимы, разные механизмы реализации.

Это сообщение отредактировал(а) kapbepucm - 12.6.2019, 10:59


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
OlegIT
Дата 13.6.2019, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Цитата

вроде как QWidget не должен быть родителем для QWindow: не совсем совместимы, разные механизмы реализации.

В том то и суть, они там как-то, исходники не смотрел, цепляют QWindow к QWidget, но прохождение сообщений не поддерживают.
PM MAIL   Вверх
kapbepucm
Дата 13.6.2019, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(OlegIT @  13.6.2019,  10:41 Найти цитируемый пост)
цепляют QWindow к QWidget
В моём втором примере это поручено QWidget::createWindowContainer.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1153 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.