单击 QDockWidget 的选项卡时的通知?

Posted

技术标签:

【中文标题】单击 QDockWidget 的选项卡时的通知?【英文标题】:Notification when QDockWidget's tab is clicked? 【发布时间】:2018-07-06 17:59:41 【问题描述】:

当用户单击选项卡化 QDockWidget 的选项卡时,我需要执行一段代码。到目前为止,我一直在通过使用“visibilityChanged”事件的黑客来做到这一点,但这现在引起了问题(例如,如果我有几个选项卡式停靠小部件并且我拖出一个使其浮动,下面的选项卡式小部件将触发其“visibilityChanged”事件,我会错误地将其解释为用户单击选项卡)。当用户单击 QDockWidgets 的选项卡时,我如何才能收到正确的通知?我已经尝试过 QDockWidget 的“focusInEvent”,但是单击选项卡时它似乎没有触发。

【问题讨论】:

当一个分区项被拖动时,点击也会触发,这样可以吗?请提供minimal reproducible example 恐怕点击事件在这里没有帮助。我只需要在用户点击标签时收到通知。 这句话是矛盾的,一方面它表明点击事件将没有用,另一方面你希望得到点击的通知。你想要土豆,但你不想要土豆。 如果我在 QDockWidget 中处理“mousePressEvent”,则当用户选择选项卡时不会引发该事件。因此,它不提供有关何时单击选项卡的通知,并且在这种情况下没有用。 你为什么认为我使用那个方法?我使用另一种方法,它在按下选项卡时启动。 :) 【参考方案1】:

当你使用tabifyDockWidget()方法QMainWindow创建一个QTabBar时,这是不能直接访问的,但是使用findChild()你可以得到它,然后使用tabBarClicked信号

from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        first_dock = None

        for i in range(10):
            dock = QtGui.QDockWidget("title ".format(i), self)
            dock.setWidget(QtGui.QTextEdit()) # testing
            self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)
            if first_dock:
                self.tabifyDockWidget(first_dock, dock)
            else:
                first_dock = dock
                dock.raise_()

        tabbar = self.findChild(QtGui.QTabBar, "")
        tabbar.tabBarClicked.connect(self.onTabBarClicked)

    def onTabBarClicked(self, index):
        tabbar = self.sender()
        text = tabbar.tabText(index)
        print("index=, text=".format(index, text))

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于单击 QDockWidget 的选项卡时的通知?的主要内容,如果未能解决你的问题,请参考以下文章

按下锁定/主页按钮时的通知,单击返回选项卡片段时的通知

禁用 Javascript 时的 Ajax 回退

在 UITabbarController 中切换选项卡时的 popToRoot UINavigationController

从选项卡控制器中删除选项卡时的自动布局问题

关闭浏览器或选项卡时如何获取 Web 通知

当打开一页的两个选项卡时,通知不起作用