拳、質問の長さについてお詫びします。
シグナルをリンクする代わりに、イベントタイプに基づいてアクションをトリガーするために、カスタムQtイベントを子ウィジェットから最上位の親ウィジェットに伝播しようとしています。
postEvent()
Qt docsは、持っているメソッドaccept()
とignore()
メソッドで投稿されたすべてのイベントを伝播できることを示唆しています(各QEvent
サブクラスを意味します)。
customEvents
代わりにメソッドをオーバーライドしようとしましevents
たが、役に立ちませんでした。
Python
PyQt4(Qtバージョンは4.6)を使用してPythonでこれを試しました。
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Foo(QWidget):
def doEvent(self):
QApplication.postEvent(self, QEvent(12345))
def event(self, event):
event.ignore()
return False
class Bar(QWidget):
def __init__(self, *args, **kwargs):
super(Bar, self).__init__(*args, **kwargs)
self.foo = Foo(self)
layout = QHBoxLayout()
layout.addWidget(self.foo)
self.setLayout(layout)
def event(self, event):
if event.type() == 12345:
self.someEventHandler()
return True
def someEventHandler(self):
print 'Handler in {0}'.format(self.__class__.__name__)
if __name__=='__main__':
app = QApplication([''])
bar = Bar()
bar.show()
bar.foo.doEvent()
app.exec_()
この例では、次のように最初の引数としてBar.someEventHandler()
イベントが投稿された場合にのみトリガーされます。self.parent()
def doEvent(self):
QApplication.postEvent(self.parent(), QEvent(12345))
イベントは受信オブジェクトに直接渡されるため、これは理解できます。
C ++
C ++での同様の例:
foobar.h
#ifndef FOOBAR_H
#define FOOBAR_H
#include <QtGui>
class Foo : public QWidget
{
Q_OBJECT
public:
Foo(QWidget *parent = 0);
void doEvent();
bool event(QEvent *);
};
class Bar : public QWidget
{
Q_OBJECT
public:
Bar(QWidget *parent = 0);
Foo *foo;
bool event(QEvent *);
};
#endif // FOOBAR_H
foobar.cpp
#include "foobar.h"
Foo::Foo(QWidget *parent)
: QWidget(parent) {}
void Foo::doEvent() {
QEvent *event = new QEvent(QEvent::User);
QApplication::postEvent(this, event);
}
bool Foo::event(QEvent *event)
{
event->ignore();
return QWidget::event(event);
}
Bar::Bar(QWidget *parent)
: QWidget(parent)
{
foo = new Foo(this);
}
bool Bar::event(QEvent *event)
{
if (event->type() == QEvent::User) {
qDebug() << "Handler triggered";
return true;
}
return QWidget::event(event);
}
main.cpp
#include <QtGui>
#include "foobar.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Bar bar(0);
bar.show();
bar.foo->doEvent();
return app.exec();
}
Pythonの場合と同じように、これはイベントがオブジェクトに直接渡される場合にのみ機能します。
void Foo::doEvent() {
QEvent *event = new QEvent(QEvent::User);
QApplication::postEvent(this->parentWidget(), event);
}
おそらく私は要点を見逃しましたが、キーイベントとマウスイベントのみが上方に伝播される可能性はありますか?