【问题标题】:qt model/view: how qt knows when to run default signal handlers, if I've reimplemented event handlers?qt 模型/视图:如果我重新实现了事件处理程序,qt 如何知道何时运行默认信号处理程序?
【发布时间】:2014-04-02 19:59:19
【问题描述】:

我有一个关于 qt 设计的一般性问题。

说,我创建了一个自定义类,包含 QAbstractTableModel 和 QTableView 类。我在View中重新实现了事件处理程序,如mousePressed、mouseRelease等。

Qt 的 View 仍然设法执行其一些默认功能:它仍然通过更改选择来响应鼠标单击和单元格上的移动,因此它以某种方式触发 selectionModel“内置”信号,尽管我没有问它。如果我拖动单元格边框等,它仍然会调整列的大小。触发那些“内置默认插槽”的机制是什么?如何禁用它的某些部分?例如。如果我想禁用selectionModel 的默认行为或默认调整大小?

为了比较,在gtk+ 中有一个默认每类信号处理程序的概念,它是一个函数,默认连接到它的信号并在您自定义的每类或每对象信号之前或之后调用处理程序,具体取决于您设置的参数。您可以从自定义插槽中禁用它,如果您想彻底控制例如调整大小或选择。

Qt 在这个地方是不透明的并且只通过它的接口函数提供定制吗?我的问题与pyqt 尤其相关。如果我太含糊,请要求澄清。

【问题讨论】:

    标签: qt model-view-controller gtk pyqt


    【解决方案1】:

    您引用的事件处理程序用于侦听事件,而不是过滤它们。您不能覆盖其中的任何事件,因为它们没有返回值:无法通知后续事件处理您不希望它运行。

    要过滤事件,您必须重新实现event 方法,并对您不想过滤的事件调用基类的实现。

    在 Qt 中,事件处理是按对象完成的,您可以将外部对象作为事件过滤器安装在任何其他对象上。对象在其event 方法中接收事件。 QObject 类实现此方法并调用timerEvent 方法。 QWidget 类重新实现此方法并调用特定于小部件的xxxEvent 方法。等等。所有这些类仍在内部处理一些事件。这些是您所说的每类处理程序。

    【讨论】:

    • 库巴奥伯,感谢您的回答。我已经阅读了一些文档,并按照您的建议在我的QTableView 中实现了一个空的event 函数:def event(self, event): return False(或return True,它不会影响结果)。如您所见,我没有调用任何事件处理程序的基类实现。尽管如此,QTableView 的所有默认功能仍然存在:它响应用鼠标选择单元格、调整单元格大小、重绘等。为什么?我认为,它不应该:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多