Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Прохождение сообщений сквозь окна.


Автор: OlegIT 10.6.2019, 14:49
Решил я свою http://forum.vingrad.ru/forum/topic-393598.html по сглаживанию с помощью QWindow. Но теперь возникла другая проблема, сообщение от действий мыши «застревают» в QWindow и не доходят до родительского QWidget. Как «пропихнуть» эти сообщения?

Автор: kapbepucm 11.6.2019, 14:54
Переопределить обработчик(-и) событий мыши (набросок кода не использовать в боевых условиях 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.

Автор: OlegIT 11.6.2019, 15:50
Скорей всего signal-slot поможет, но только не в прямую, обработчики мыши не сигнальные.
А что, штатно ни как?
Честно говоря по первому варианту не понял, там же QWindow хитрым образом к QWidget подключается. Впечатление, что это просто заплатка.

Автор: kapbepucm 12.6.2019, 09: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: не совсем совместимы, разные механизмы реализации.

Автор: OlegIT 13.6.2019, 10:41
Цитата

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

В том то и суть, они там как-то, исходники не смотрел, цепляют QWindow к QWidget, но прохождение сообщений не поддерживают.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)