QTabWidget 插入一个 QSplitter 禁用拆分器时无法切换
QTabWidget insert a QSplitter can't switch when the splitter disabled
我在QSplitter中插入了一个QFrame和QTabWidget。我想禁止调整 QSplitter 中元素的大小。所以我在QSplitter中调用了'setDisabled'的方法。它对于禁用调整元素大小很有用。但我也无法切换 QTabWidget 的选项卡。谁能给我一些建议?非常感谢......
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QSplitter, QHBoxLayout, QFrame, QTabWidget
from PyQt5.QtCore import Qt
class Example1(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 600, 600)
self.setWindowTitle("Demo")
self.layout = QHBoxLayout()
top_frame = QFrame()
top_frame.setFrameShape(QFrame.StyledPanel)
bottom_frame = QTabWidget(self)
tab1 = QWidget()
tab2 = QWidget()
bottom_frame.setTabText(0, "Generic")
bottom_frame.setTabText(1, "Other")
bottom_frame.addTab(tab1, "Tab 1")
bottom_frame.addTab(tab2, "Tab 2")
splitter = QSplitter()
splitter.setOrientation(Qt.Vertical)
splitter.addWidget(top_frame)
splitter.addWidget(bottom_frame)
splitter.setSizes([300, 300])
**splitter.setDisabled(True)**
self.layout.addWidget(splitter)
self.setLayout(self.layout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example1()
sys.exit(app.exec_())
程序的运行结果
我以前没有使用过 QSplitter,但是 .setFixedHeight(300)
.setFixedWidth(300)
或 .setFixedSize(300, 300)
方法在这里不适用吗?
当您禁用一个小部件时,您也会禁用它的子部件,因此禁用 QSplitter 也会禁用 QTabWidget。
一个可能的解决方案是启用或禁用句柄:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QApplication,
QFrame,
QHBoxLayout,
QSplitter,
QSplitterHandle,
QTabWidget,
QWidget,
)
class CustomSplitter(QSplitter):
@property
def enabled(self):
if not hasattr(self, "_enabled"):
self._enabled = True
return self._enabled
@enabled.setter
def enabled(self, d):
self._enabled = d
for i in range(self.count()):
self.handle(i).setEnabled(self.enabled)
def createHandle(self):
handle = super().createHandle()
handle.setEnabled(self.enabled)
return handle
class Example1(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 600, 600)
self.setWindowTitle("Demo")
self.layout = QHBoxLayout()
top_frame = QFrame()
top_frame.setFrameShape(QFrame.StyledPanel)
bottom_frame = QTabWidget(self)
tab1 = QWidget()
tab2 = QWidget()
bottom_frame.setTabText(0, "Generic")
bottom_frame.setTabText(1, "Other")
bottom_frame.addTab(tab1, "Tab 1")
bottom_frame.addTab(tab2, "Tab 2")
splitter = CustomSplitter()
splitter.setOrientation(Qt.Vertical)
splitter.addWidget(top_frame)
splitter.addWidget(bottom_frame)
splitter.setSizes([300, 300])
splitter.enabled = False
self.layout.addWidget(splitter)
self.setLayout(self.layout)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example1()
sys.exit(app.exec_())
QSplitter 可让您掌握其句柄,这些句柄是用户可见的 GUI 元素。如果拆分器中有两个小部件,则只有一个可见的句柄;索引 0 处的句柄始终不可见。
您可以明确地操作该小部件,例如禁用它。尝试:
splitter.handle(1).enabled = False
这只会禁用所述 GUI 元素,而拆分器的其余部分(您的两个内容小部件)将保持启用状态。
我在QSplitter中插入了一个QFrame和QTabWidget。我想禁止调整 QSplitter 中元素的大小。所以我在QSplitter中调用了'setDisabled'的方法。它对于禁用调整元素大小很有用。但我也无法切换 QTabWidget 的选项卡。谁能给我一些建议?非常感谢......
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QSplitter, QHBoxLayout, QFrame, QTabWidget
from PyQt5.QtCore import Qt
class Example1(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 600, 600)
self.setWindowTitle("Demo")
self.layout = QHBoxLayout()
top_frame = QFrame()
top_frame.setFrameShape(QFrame.StyledPanel)
bottom_frame = QTabWidget(self)
tab1 = QWidget()
tab2 = QWidget()
bottom_frame.setTabText(0, "Generic")
bottom_frame.setTabText(1, "Other")
bottom_frame.addTab(tab1, "Tab 1")
bottom_frame.addTab(tab2, "Tab 2")
splitter = QSplitter()
splitter.setOrientation(Qt.Vertical)
splitter.addWidget(top_frame)
splitter.addWidget(bottom_frame)
splitter.setSizes([300, 300])
**splitter.setDisabled(True)**
self.layout.addWidget(splitter)
self.setLayout(self.layout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example1()
sys.exit(app.exec_())
程序的运行结果
我以前没有使用过 QSplitter,但是 .setFixedHeight(300)
.setFixedWidth(300)
或 .setFixedSize(300, 300)
方法在这里不适用吗?
当您禁用一个小部件时,您也会禁用它的子部件,因此禁用 QSplitter 也会禁用 QTabWidget。
一个可能的解决方案是启用或禁用句柄:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QApplication,
QFrame,
QHBoxLayout,
QSplitter,
QSplitterHandle,
QTabWidget,
QWidget,
)
class CustomSplitter(QSplitter):
@property
def enabled(self):
if not hasattr(self, "_enabled"):
self._enabled = True
return self._enabled
@enabled.setter
def enabled(self, d):
self._enabled = d
for i in range(self.count()):
self.handle(i).setEnabled(self.enabled)
def createHandle(self):
handle = super().createHandle()
handle.setEnabled(self.enabled)
return handle
class Example1(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 600, 600)
self.setWindowTitle("Demo")
self.layout = QHBoxLayout()
top_frame = QFrame()
top_frame.setFrameShape(QFrame.StyledPanel)
bottom_frame = QTabWidget(self)
tab1 = QWidget()
tab2 = QWidget()
bottom_frame.setTabText(0, "Generic")
bottom_frame.setTabText(1, "Other")
bottom_frame.addTab(tab1, "Tab 1")
bottom_frame.addTab(tab2, "Tab 2")
splitter = CustomSplitter()
splitter.setOrientation(Qt.Vertical)
splitter.addWidget(top_frame)
splitter.addWidget(bottom_frame)
splitter.setSizes([300, 300])
splitter.enabled = False
self.layout.addWidget(splitter)
self.setLayout(self.layout)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example1()
sys.exit(app.exec_())
QSplitter 可让您掌握其句柄,这些句柄是用户可见的 GUI 元素。如果拆分器中有两个小部件,则只有一个可见的句柄;索引 0 处的句柄始终不可见。
您可以明确地操作该小部件,例如禁用它。尝试:
splitter.handle(1).enabled = False
这只会禁用所述 GUI 元素,而拆分器的其余部分(您的两个内容小部件)将保持启用状态。