标签: qt-events

Qt中的事件传播

我只是关于Qt事件系统QEvent的文档.我对该QObject::event()方法的行为感兴趣.文件说明:

此虚函数接收事件到对象,如果事件e被识别和处理,则应返回true.

falseevent()方法返回时的预期行为是什么?还有什么办法来处理这个事件?事件是否自动转发到父对象?

注意:我知道源代码可用,而且我有副本.我理想地寻找解决此行为的一些文档.

qt qt-events

13
推荐指数
1
解决办法
9829
查看次数

Qt GUI事件录制和播放

我正在尝试实现一个简单,轻量级的系统来记录Qt GUI事件并从脚本中播放它们.我认为使用Qt事件系统的魔力会相当简单,但我遇到了一个我不明白的问题.

以下是我正在做的事情的快速摘要:

记录:

QApplication.instance().eventFilter()用来捕获我感兴趣的所有GUI事件*并将它们保存到Python脚本中,其中每个步骤看起来像这样:

obj = get_named_object('MainWindow.my_menubar')
recorded_event = QMouseEvent(2, PyQt4.QtCore.QPoint(45, 8), 1, Qt.MouseButtons(0x1), Qt.KeyboardModifiers(0x0))
post_event(obj, recorded_event)
Run Code Online (Sandbox Code Playgroud)

回放:

我只是在一个worker(非GUI)线程中执行上面的脚本.(我不能使用GUI线程,因为我想继续向应用程序发送脚本事件,即使在模式对话框eventloop运行时'main'eventloop被阻止.)

重要的东西发生在我的post_event()函数中,它需要做两件事:

  • 首先,打电话 QApplication.postEvent(obj, recorded_event)
  • 等待所有事件完成处理:**
    • 将特殊事件发布到obj正在运行的同一事件循环中.
    • 处理特殊事件时:
      • 呼叫 QApplication.processEvents()
      • 设置一个标志,告诉回放线程可以继续

在第二部分完成之后,我的期望是第一部分(记录的事件)的所有效果都已完成,因为特殊事件在记录的事件之后排队.

整个系统似乎主要适用于鼠标事件,关键事件等.但是QAction当我尝试为主要事件播放事件时,我遇到了处理程序的问题QMenuBar.

无论我尝试什么,似乎我都不能强制我的回放线程阻止完成QAction.triggered因点击我的QMenu项目而导致的所有处理程序.据我所知,在处理程序完成之前QApplication.processEvents()返回.QAction

QMenu小部件或QAction信号是否有特殊之处,违反了正常规则QApplication.postEvent()和/或QApplication.processEvents()我需要一种阻止完成我QMenuQAction处理程序的方法.

[*]并非每个事件都被记录下来.我只记录spontaneous()事件,我还过滤掉了一些其他类型(例如Paint …

c++ python qt pyqt qt-events

9
推荐指数
1
解决办法
1999
查看次数

为什么我的 Qt eventFilter 没有拾取 QTreeWidget 上的鼠标事件?

我基本上有这段代码来拦截某些QTreeWidget事件。

MyWidget :: MyWidget ()
{
     m_tree = new QTreeWidget ();
     // ...
     m_tree -> installEventFilter (this);
}

bool MyWidget :: eventFilter (QObject * obj, QEvent * e)
{
    if (m_tree != obj)
        return QWidget :: eventFilter (obj, e);

    qDebug () << e -> type ();

    switch (e -> type ())
    {
        case QEvent :: MouseButtonPress:
        case QEvent :: MouseButtonRelease:
        case QEvent :: MouseMove:
        case QEvent :: Leave:
            qDebug () << "GOT EM";
            break;
    };

    // ...
 } …
Run Code Online (Sandbox Code Playgroud)

c++ qt qtreewidget qt-events qmouseevent

5
推荐指数
1
解决办法
1990
查看次数

Pyside QgraphicsScene无法捕获鼠标事件

我找不到将鼠标事件附加到场景的方法。如果没有 View,所有事件都会被捕获,但是当注释掉时,只有 mousePressEvent 起作用。请帮忙。

from PySide import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.Scene()
        self.View()

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print "Pressed!!!"

    def mouseMoveEvent(self, event):
        print "moving....."

    def mouseReleaseEvent(self, event):
        print "-------released"

    def Scene(self):
        self.s = QtGui.QGraphicsScene(self)

    def View(self):
        self.v = QtGui.QGraphicsView(self.s)
        self.setCentralWidget(self.v)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

qt pyqt pyside qt-events qt-signals

0
推荐指数
1
解决办法
2102
查看次数

标签 统计

qt ×4

qt-events ×4

c++ ×2

pyqt ×2

pyside ×1

python ×1

qmouseevent ×1

qt-signals ×1

qtreewidget ×1