Qt:如何制作像 QTextField 一样对齐的自定义小部件
Qt: How to make custom widget that aligns like QTextField
我正在尝试制作一个 DirectoryEditWidget
,即类似于 QLineEdit
小部件的小部件,但带有一个浏览按钮以允许用户浏览目录的文件系统。
该功能在下面的实现中有效,但我想要一个可以插入 QFormLayout
并与其他所有内容很好地对齐的解决方案。
class FileEditWidget(QtWidgets.QWidget):
"""
A textfield with a browse button.
"""
def __init__(self, parent=None):
super().__init__(parent)
layout = QtWidgets.QHBoxLayout()
self.file_line_edit = QtWidgets.QLineEdit()
layout.addWidget(self.file_line_edit, stretch=1)
browse_button = QtWidgets.QPushButton("...")
layout.addWidget(browse_button)
self.setLayout(layout)
browse_button.clicked.connect(self.browse)
def browse(self, msg = None, start_path = None):
directory = QtWidgets.QFileDialog.getExistingDirectory(self,
msg or "Find files", start_path or QtCore.QDir.currentPath())
if directory:
self.file_line_edit.setText(directory)
我怀疑,我将不得不修改父 QWidget
对象或布局的布局属性 -- 但我不知道从哪里开始?
在下面的屏幕截图中,我包含了我的自定义小部件,如下所示:
def create_form_group(self):
form_group_box = QtWidgets.QGroupBox("Central widget with form layout")
layout = QtWidgets.QFormLayout()
layout.addRow(QLabel("Name of stuff"), QtWidgets.QLineEdit())
layout.addRow(QLabel("Folder name"), FileEditWidget())
layout.addRow(QLabel("Some selection"), QtWidgets.QComboBox())
问题是由布局的边距引起的。
根据 documentation:
By default, QLayout uses the values provided by the style. On most
platforms, the margin is 11 pixels in all directions.
在下图中,我显示了这些边距:
要删除它们,请在 FileEditWidget 中使用它。
class FileEditWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
[...]
layout = QtWidgets.QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
我正在尝试制作一个 DirectoryEditWidget
,即类似于 QLineEdit
小部件的小部件,但带有一个浏览按钮以允许用户浏览目录的文件系统。
该功能在下面的实现中有效,但我想要一个可以插入 QFormLayout
并与其他所有内容很好地对齐的解决方案。
class FileEditWidget(QtWidgets.QWidget):
"""
A textfield with a browse button.
"""
def __init__(self, parent=None):
super().__init__(parent)
layout = QtWidgets.QHBoxLayout()
self.file_line_edit = QtWidgets.QLineEdit()
layout.addWidget(self.file_line_edit, stretch=1)
browse_button = QtWidgets.QPushButton("...")
layout.addWidget(browse_button)
self.setLayout(layout)
browse_button.clicked.connect(self.browse)
def browse(self, msg = None, start_path = None):
directory = QtWidgets.QFileDialog.getExistingDirectory(self,
msg or "Find files", start_path or QtCore.QDir.currentPath())
if directory:
self.file_line_edit.setText(directory)
我怀疑,我将不得不修改父 QWidget
对象或布局的布局属性 -- 但我不知道从哪里开始?
在下面的屏幕截图中,我包含了我的自定义小部件,如下所示:
def create_form_group(self):
form_group_box = QtWidgets.QGroupBox("Central widget with form layout")
layout = QtWidgets.QFormLayout()
layout.addRow(QLabel("Name of stuff"), QtWidgets.QLineEdit())
layout.addRow(QLabel("Folder name"), FileEditWidget())
layout.addRow(QLabel("Some selection"), QtWidgets.QComboBox())
问题是由布局的边距引起的。
根据 documentation:
By default, QLayout uses the values provided by the style. On most platforms, the margin is 11 pixels in all directions.
在下图中,我显示了这些边距:
要删除它们,请在 FileEditWidget 中使用它。
class FileEditWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
[...]
layout = QtWidgets.QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)