问:如何制作与QTextField一致的自定义小部件

时间:2017-06-27 15:49:11

标签: python pyqt pyqt5 qlineedit qlayout

我正在尝试创建DirectoryEditWidget,即类似于QLineEdit窗口小部件的窗口小部件,但是使用浏览按钮允许用户浏览目录的文件系统。 该功能在下面的实现中有效,但我想要一个能够捕捉到QFormLayout并与其他所有内容完美排列的解决方案。

enter image description here

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())

1 个答案:

答案 0 :(得分:2)

问题是由布局的边距引起的。

根据documentation

  

默认情况下,QLayout使用样式提供的值。最多的   平台,边距为11个像素。

在下图中,我显示了这些边距:

enter image description here

要删除它们,请在FileEditWidget中使用它。

class FileEditWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        [...]
        layout = QtWidgets.QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)

enter image description here