PyQt5:QLineEdit 正在大量扩展并破坏我的网格布局

PyQt5: QLineEdit is massively expanding and ruining my grid layout

请原谅这个可能非常简单的问题,我是 PyQt5 的新手,我真的很难理解它是如何工作的。

我正在尝试为我的程序制作一个粗略的现成选项菜单,作为其中的一部分,我想为用户输入添加一些小文本框。我一直在使用网格布局系统来让自己更轻松,但 QLineEdit 文本框似乎试图水平扩展并挤压其他所有内容。

我的 window 没有文本框时的样子

我的window文本框的样子

我看过关于使用 setHorizo​​ntalPolicy 的讨论,但我不理解文档(并且尝试手动解决它是行不通的)。

(理想情况下,我希望我的 window 看起来像这样:

_______________________________________________
|          [title         |      [title]      |
|                         |[label] [text box] |
|                         |[label] [text box] |
|      checkboxes         |[label] [text box] |
|                         |[label] [text box] |
|                         |                   |
|                         |                   |
|                         |  [some buttons]   |
|_________________________|___________________|

)

以下是我的代码中最相关的部分,如果有帮助的话。

class label_and_qle(QWidget):

def __init__(self, label):
    
    super().__init__()
    self.label = label
    self.initUI()

def initUI(self):
    
    grid = QGridLayout()
    self.setLayout(grid)

    qle = QLineEdit(self)
    qle_label = set_labels()  
    qle.setFixedWidth(80)
    qle_label.set_label_dynamic(self.label)
    # qle.textChanged[str].connect(self.change_options)
    
    grid.addWidget(qle_label, 0, 0, 1, 2)
    grid.addWidget(qle, 0, 2, 1, 1)

class misc_options_gui(QWidget):
    
def __init__(self):
    
    super().__init__()
    self.initUI()
    
def initUI(self):
    
    grid = QGridLayout()
    self.setLayout(grid)
    
    #Set the section title
    lab_title = set_labels()
    lab_title.set_label_title(data_options.misc_options_title)
    grid.addWidget(lab_title, 0, 0)
    
    error_tol = label_and_qle("Error tolerance", data_options.error_tolerance)
    grid.addWidget(error_tol, 5, 0)
    
    #Creat a button to set Folder destination
    set_path =  QPushButton('set folder', self)
    set_path.clicked.connect(self.get_folder)
    grid.addWidget(set_path, 12, 0)
    
    #Create button to launch iMMPY program
    run_button = QPushButton('Run iMMPY script', self)
    run_button.clicked.connect(self.run_iMMPY)
    grid.addWidget(run_button, 14, 0)

def run_iMMPY(self):
    
    if data_options.path == []:
        self.get_folder()
    
    self.showMinimized()
    run_iMMPY()
    self.close()
    
def get_folder(self):
    
    folder = QFileDialog.getExistingDirectory(parent = None, caption = "Select folder")
    data_options.path = folder

class Example(QMainWindow):
'''
This object is the main window of the options menu
'''

def __init__(self):
    
    super().__init__()
    self.initUI()
 
def initUI(self):
    '''
    Initialise main window's UI
    '''
    
    #Create central widget
    self.central_widget = QWidget()               
    self.setCentralWidget(self.central_widget) 
    
    #Define grid layout
    self.grid = QGridLayout()
    self.centralWidget().setLayout(self.grid)
    
    checkboxes = checkboxes_gui(data_options.checkboxes_title, data_options.names_list, data_options.defaults_list)

    misc_options = misc_options_gui()
    

    
    self.grid.addWidget(checkboxes, 0, 0, 1, 3)
    self.grid.addWidget(misc_options, 0, 3, 1, 1)
    checkboxes.resize(500, 750)
    misc_options.resize(250, 750)
    
    #Set window properties
    self.setGeometry(600, 200, 750, 750)
    self.setWindowTitle('Options menu')
    self.show()

感谢您的帮助

使用 Qt 时,扩展标签有点令人困惑。我处理过很多布局问题。你可以尝试几件事。问题似乎是由您的标签“容错”引起的。它的水平扩展比你想象的要多。如果您使用Qt Designer 设计GUI,您可以在属性 编辑器中将“Horizo​​ntal Policy”更改为“Maximum”。这似乎违反直觉,但 Maximum 将使您的标签仅扩展到文本实际占用的 space 。要在没有 Qt Designer 的情况下仅使用代码来做到这一点,我认为这可能有效:

    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
    self.label.setSizePolicy(sizePolicy)

将 'label' 替换为您要修改的标签 Widget。