python - pyqt 小部件未扩展到父级
问题描述
试图让一个自定义小部件扩展到父级,它只是在我的小部件继承自 QLabel 而不是 QWidget 时做我想做的事情。我已经尝试设置 QSizePolicy 但它似乎仍然没有工作
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout
from mywidgets import MenuLabel, MenuWidget, MainWidget
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("InstaPlus")
outerlayout = QHBoxLayout()
outerlayout.setContentsMargins(0, 0, 0, 0)
outerlayout.setSpacing(0)
menulayout = QVBoxLayout()
menulayout.setContentsMargins(0, 0, 0, 0)
menulayout.setSpacing(0)
menuwidget = MenuWidget()
mainwidget = MainWidget()
menulayout.addWidget(MenuLabel("Menu Item 1"))
menulayout.addWidget(MenuLabel("Menu Item 2"))
menulayout.addWidget(MenuLabel("Menu Item 3"))
menulayout.addWidget(MenuLabel("Menu Item 4"))
menulayout.addWidget(MenuLabel("Menu Item 5"))
menulayout.addStretch()
menuwidget.setLayout(menulayout)
outerlayout.addWidget(menuwidget)
outerlayout.addWidget(mainwidget)
self.setLayout(outerlayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = Window()
main.resize(800, 500)
main.show()
sys.exit(app.exec_())
这是我的小部件代码
from PyQt5.QtWidgets import QLabel, QWidget, QSizePolicy
class MenuLabel(QLabel):
def __init__(self, title):
super().__init__()
self.title = title
self.setText(self.title)
self.setStyleSheet(open("styles.css").read())
class MenuWidget(QWidget):
def __init__(self):
super().__init__()
self.setAccessibleName("menu")
self.setStyleSheet(open("styles.css").read())
self.setFixedWidth(200)
class MainWidget(QWidget):
def __init__(self):
super().__init__()
self.setAccessibleName("main")
self.setStyleSheet(open("styles.css").read())
这是从 QWidget 继承时的布局
当我的小部件从 QLabel 继承时就是这样
如何让我的小部件从 Qwidget 继承并让它们像 QLabel 一样调整大小?
这是样式文件
MenuLabel{
background-color: #484848;
color: #dadada;
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
padding-right: 100px;
font-size: 10pt;
font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif
}
MenuLabel:hover{
background-color: rgba(8, 3, 9, 0.65);
}
[accessibleName="menu"]{
background-color: #484848;
}
[accessibleName="main"]{
background-color: #2e2e2e;
}
解决方案
每当您从 QWidget 或 QLabel 子类化时,您的类的大小MenuWidget
完全相同。
问题是当从 QWidget 子类化时,设置样式表是不够的。正如官方样式表参考文档所解释的:
如果你从 QWidget 继承,你需要为你的自定义 QWidget 提供一个paintEvent。
class MenuWidget(QWidget):
# ...
def paintEvent(self, event):
opt = QtWidgets.QStyleOption()
opt.initFrom(self)
qp = QtGui.QPainter(self)
self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget, opt, qp, self)
如果您accessibleName()
仅将其用作样式表选择器,请考虑这不是一个好的选择,因为可访问名称可以(应该)本地化,并且不是识别样式表中的类的正确方法。改用选择器objectName()
和#objectName {}
选择器。请参阅样式表语法文档中的选择器类型章节。
推荐阅读
- git - Azure Devops Git 分支区分大小写
- shopify - 我已从 Shopify 合作伙伴嵌入了我的 Shopify 应用程序,但该应用程序仍会在其自己的浏览器窗口中打开
- vb.net - 如何将 Data gridview 列转换为字符串列表?
- flutter - 如何在 Flutter 中组合多个提供者
- sql-server - Docker容器执行错误
- javascript - Tailwind 不在生产版本中应用自定义字体系列
- xamarin - 在 Xamarin.Forms 中调用 PropertyChanged 时,UI 上的更新列表不会更改
- c - 是否可以在线程之间共享文件指针?
- c# - 在 Visual Studio 2019 社区中更改查找全部/搜索全部结果界面
- c# - Blazor WebAssembly 无法从类库加载资源文件