【发布时间】:2021-07-27 18:44:47
【问题描述】:
在我的应用程序中,我有一个 QTabWidget,它包含可变数量的看似“相同”的选项卡和可变数量的小部件。 我希望,一旦按下 TAB(或 shift-TAB)按钮,应用程序的焦点将移动到下一个(或上一个)选项卡,并专注于该选项卡的相应小部件(与在按键之前一直保持焦点)。
以简单的方式解决此问题的最佳方法是什么?我尝试使用 QShortcut 来捕捉按键,但我似乎无法找到一种方法来获取下一个或上一个选项卡中的相应小部件并专注于此。
这是代码的最小示例,它只是移动到下一个选项卡而不是相应的小部件:
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import *
class tabdemo(QTabWidget):
def __init__(self, num_tabs=2):
super().__init__()
shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Tab), self)
shortcut.activated.connect(self.on_tab)
shortcut2 = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Backtab), self)
shortcut2.activated.connect(self.on_shift_tab)
self.tabs = []
for i in range(num_tabs):
newtab = QWidget()
self.tabs.append(newtab)
self.addTab(newtab, f'Tab {i}')
self.add_widgets_to(newtab)
def add_widgets_to(self, tab):
layout = QVBoxLayout()
tab.setLayout(layout)
layout.addWidget(QSpinBox())
layout.addWidget(QCheckBox())
gender = QHBoxLayout()
gender.addWidget(QRadioButton("Male"))
gender.addWidget(QRadioButton("Female"))
layout.addLayout(gender)
@QtCore.pyqtSlot()
def on_tab(self):
current_tab = self.currentIndex()
self.setCurrentIndex((current_tab + 1) % self.count())
# TODO find current widget in focus, and find the corresponding one in the next tab, and focus on that one... note that widgets could be complex (i.e., not direct children...)
@QtCore.pyqtSlot()
def on_shift_tab(self):
print("do_something")
current_tab = self.currentIndex()
self.setCurrentIndex((current_tab - 1) % self.count())
def main():
app = QApplication(sys.argv)
ex = tabdemo()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
【问题讨论】:
-
添加了一个最小的可重现示例
-
您能否更详细地解释您的短语:但不是针对相应的小部件。每个标签对应的小部件是什么,或者是否有任何标准可以知道哪些小部件是对应的吗?
-
选项卡是彼此相同的副本:它们使用相同的功能构建,创建填充选项卡的小部件的新实例。 “相应的小部件”可能与当前小部件位于相同的 (x,y) 位置(在另一个选项卡中除外)?虽然这个定义可能会遇到像组合框这样的小部件的问题......我的想法是找出当前焦点所在的小部件/布局,以某种方式找出它相对于选项卡的“子编号”,然后获取第 i 个子下一个选项卡(对于相同的 i 值)。但是我找不到这样的功能。
-
据我了解,您的选项卡将具有相同的小部件,如果我们将索引与选项卡中的每个小部件相关联,那么如果它位于第 i 个选项卡中并且第 j 个小部件具有焦点如果TAB被按下,那么它必须更改为第(i + 1)个选项卡并且当前选项卡对应的第j个小部件必须具有焦点?
-
是的,就是这样。我看到的一个问题是,由于第 i 个小部件实际上可能是“复杂小部件”或包含许多其他小部件的布局,如果没有某种递归解决方案,这可能无法正常工作?也许使用继承并添加功能来跟踪子项作为混合?如果不清楚,我可以扩展这个问题
标签: python pyqt5 qtabwidget