Qt:如何制作像 QTextField 一样对齐的自定义小部件

Posted

技术标签:

【中文标题】Qt:如何制作像 QTextField 一样对齐的自定义小部件【英文标题】:Qt: How to make custom widget that aligns like QTextField 【发布时间】:2017-06-27 15:49:10 【问题描述】:

我正在尝试制作一个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())

【问题讨论】:

所有小部件在每一侧都有可自定义的内容边距。上、下、左、右。默认情况下它们有一些小的值,这就是为什么您会在 FileEditWidget 的所有侧面看到轻微的缩进。在 FileEditWidget 上调用 setContentsMargins(leftMargin, topMargin, rightMargin, bottomMargin) 的 python 等效项,替换为您想要的值(尝试 0 表示左右边距),它应该正确对齐。另请注意,所有 Qt 布局都具有完全相同的概念,尽管我不相信它们默认设置任何边距。 我的错误是布局具有默认边距,而不是小部件:) 下面的答案很好地指出了这一点。 【参考方案1】:

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

根据documentation:

默认情况下,QLayout 使用样式提供的值。在大多数 平台,所有方向的边距为 11 像素。

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

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

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

【讨论】:

以上是关于Qt:如何制作像 QTextField 一样对齐的自定义小部件的主要内容,如果未能解决你的问题,请参考以下文章

Qt富文本中图像对象的最小尺寸和对齐问题

Notepad++如何让代码自动对齐,像 vc里的alt + F8一样 求插件

有关如何通过 flex 属性居中对齐的问题

如何在 Qt TableView 中实现像过滤一样的电子表格?

以 1 的结构成员对齐方式编译 Qt

如何制作像 Instagram 一样的导航栏