如何解决将标签从 QTabWidget 调整为内容
我使用 QTabWidget 来显示不同大小的内容。如何以与我的内容相匹配的方式调整标签的大小?
目标:
表 1:
标签 2:
我试图编写一个连接到 QTabWidget.currentChanged() 的函数,我设法忽略了 QSizePolicy,但调整大小没有生效。但是,我可以毫无问题地手动调整大小。
master
解决方法
QTabWidget 与 QStackedWidget 一样,使用 QStackedLayout,它总是使用其所有小部件的最小尺寸提示计算出最小尺寸提示。
为了防止这种情况发生,应该重新实现 sizeHint()
和 minimumSizeHint()
,并且应该在索引更改时调用 updateGeometry()
。
在下面的例子中,我统一了从 QTabWidget 的 :sizeHint()
转换而来的两个函数,但是为了提供正确的实现,原始的 :minimumSizeHint()
实现也应该被改编。
class TabWidget(QTabWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.currentChanged.connect(self.updateGeometry)
def minimumSizeHint(self):
return self.sizeHint()
def sizeHint(self):
lc = QSize(0,0)
rc = QSize(0,0)
opt = QStyleOptionTabWidgetFrame()
self.initStyleOption(opt)
if self.cornerWidget(Qt.TopLeftCorner):
lc = self.cornerWidget(Qt.TopLeftCorner).sizeHint()
if self.cornerWidget(Qt.TopRightCorner):
rc = self.cornerWidget(Qt.TopRightCorner).sizeHint()
layout = self.findChild(QStackedLayout)
layoutHint = layout.currentWidget().sizeHint()
tabHint = self.tabBar().sizeHint()
if self.tabPosition() in (self.North,self.South):
size = QSize(
max(layoutHint.width(),tabHint.width() + rc.width() + lc.width()),layoutHint.height() + max(rc.height(),max(lc.height(),tabHint.height()))
)
else:
size = QSize(
layoutHint.width() + max(rc.width(),max(lc.width(),tabHint.width())),max(layoutHint.height(),tabHint.height() + rc.height() + lc.height())
)
return size
class Window(QWidget):
def __init__(self):
# ...
# no need to for a specific function,just directly call adjustSize()
self.tabs.currentChanged.connect(self.adjustSize)
两个小建议。 1) 避免代码中不必要的行间距,因为它会分散注意力。 2) __init__
最好放在类的开头,前面没有任何自定义函数:它是“初始化”,不应该放在其他东西之后。
我为我的代码管理了一个黑客修复:
import sys
from PyQt5.QtCore import (
QSize
)
from PyQt5.QtWidgets import (
QApplication,QCheckBox,QTabWidget,QVBoxLayout,QHBoxLayout,QWidget,QLabel,QLineEdit,QSizePolicy,)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Define Volumes")
# Create a top-level layout
layout = QVBoxLayout ()
# Create the tab widget with two tabs
self.tabs = QTabWidget()
self.tabs.addTab(self.generalTabUI(),"Input")
self.tabs.addTab(self.helpTabUI(),"Help")
self.tabs.currentChanged.connect(self.curTabChanged)
self.curTabChanged(0)
layout.addWidget(self.tabs)
self.setLayout(layout)
self.rsz()
def curTabChanged(self,index):
for i in range(self.tabs.count()):
self.tabs.widget(i).setSizePolicy(QSizePolicy.Ignored,QSizePolicy.Ignored)
widget = self.tabs.currentWidget()
widget.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred)
const_width = self.tabs.widget(1).minimumSizeHint().width()
widget.setFixedWidth(const_width)
self.rsz()
def rsz(self):
for i in range(0,10):
QApplication.processEvents()
return self.resize(self.minimumSizeHint())
def generalTabUI(self):
"""Create the General page UI."""
generalTab = QWidget()
layout = QHBoxLayout()
self.label_text_left = QLabel("1-")
self.label_text_right = QLabel("-100")
self.textbox = QLineEdit()
layout.addWidget(self.label_text_left)
layout.addWidget(self.textbox)
layout.addWidget(self.label_text_right)
generalTab.setLayout(layout)
return generalTab
def helpTabUI(self):
helpTab = QWidget()
layout = QVBoxLayout()
self.label = QLabel(self)
self.label.setText("Lorem ipsum dolor sit amet,consectetur adipiscing elit,\n\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. \n\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \n\nExcepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum.")
layout.addWidget(self.label)
helpTab.setLayout(layout)
return helpTab
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。