经过数月的研究和询问,我发现了一种解决方案,可以将边距重置为0,将填充重置为0,在qt中使用样式表对小部件进行样式化,并从头开始设计。
使用qt4样式表风格化小部件边距/填充的101指南
- 创建任何类型的BoxModel可样式化小部件(不要使用
QWidget
,而是使用QFrame
!)查看文档 - 将普通布局分配给它。
- 如果您不想要默认边距(大约为8px左右),则必须将布局(而不是小部件,您可以,但不起作用)内容边距设置为0:
setContentsMargins(0,0,0,0)
。 - 可选地(我不知道哪些情况),将间距设置为0,以将所有内容重置为极端状态(无边框,完全没有):
setSpacing(0)
- 将小部件对象名称设置为自定义名称:
setObjectName("name")
。 - 通过您的小部件设置样式更改QFrame:
QFrame#name { things... }
然后您可以使用类名创建样式。If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
void CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }
The above code is a no-operation if there is no stylesheet set.
Warning: Make sure you define the Q_OBJECT macro for your custom widget.
ClassName {}
现在,我有一个严重的问题,我与其他人分享了这个问题,但是我没有解决方案。 填充根本不起作用,只有外边距有效。 所以,
ClassName
{ padding: 200px; margin: 5px; }
与...相同
ClassName
{ margin: 5px; }
这就带来了一个烦恼的局面,当你必须使用边距创建子容器以添加填充时。这会导致无限层级...这一点都不理想。
有人知道如何完全完成我的101指南吗?
ClassName
类,是QFrame
的子类吗? - thugaQAbstractItemView
子类、QAbstractSpinBox
子类、QCheckBox
、QComboBox
、QFrame
、QGroupBox
、QLabel
、QLineEdit
、QMenu
、QMenuBar
、QPushButton
、QRadioButton
、QSplitter
、QTextEdit
和QToolTip
支持。因此,我认为您不能将其用于自定义的QWidget
子类。 - hank