PyQt5: QLineEdit сильно расширяется и разрушает мою сетку

Извините за, вероятно, довольно простой вопрос, я очень новичок в PyQt5 и действительно изо всех сил пытаюсь понять, как это работает.

Я пытаюсь сделать грубое и готовое меню параметров для своей программы, и в рамках этого я хотел бы добавить несколько небольших текстовых полей для ввода данных пользователем. Я использовал систему компоновки сетки, чтобы упростить себе задачу, но кажется, что текстовые поля QLineEdit пытаются расширяться по горизонтали и сжимать все остальное.

Как выглядит мое окно без текстового поля

Как выглядит мое окно с текстовым полем

Я видел разговоры об использовании setHorizontalPolicy, но я не понимаю документацию (и попытка разобраться вручную не работает).

(В идеале я бы хотел, чтобы мое окно выглядело примерно так:

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

Спасибо за любую помощь, которую вы можете дать


person SarkyQuark    schedule 24.06.2020    source источник


Ответы (1)


Расширяющиеся метки немного сбивают с толку при использовании Qt. Я много занимался вопросами компоновки. Пара вещей, которые вы могли бы попробовать. Похоже, что ваша этикетка с надписью "Допуск к ошибкам" вызывает проблему. Он расширяется по горизонтали больше, чем вам хотелось бы. Если вы используете Qt Designer для разработки графического интерфейса, вы можете изменить горизонтальную политику на максимальную в редакторе свойств. Это кажется нелогичным, но Maximum заставит вашу метку расширяться только на столько места, сколько занимает текст. Чтобы сделать это без Qt Designer и просто с помощью кода, я думаю, это может сработать:

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

замените «метку» на виджет метки, который вы хотите изменить.

person Nester    schedule 24.06.2020
comment
Большое спасибо за твою помощь. Использование этого частично решило проблему: добавление политики к метке на самом деле не помогает (на самом деле по какой-то причине она полностью исчезает), применение политики к QLE правильно ограничивает ее по горизонтали. проблема в том, что теперь он перестает быть ограниченным по вертикали и будет простираться вниз, насколько это возможно. Я могу сделать эту работу, но мне интересно, знаете ли вы, как решить эту вторую проблему? Я прикреплю фотографии проблем в другом комментарии, так как мне не хватает места. - person SarkyQuark; 25.06.2020
comment
Если вас не беспокоит автоматический размер макета, вы можете установить максимальные размеры для элементов управления. Таким образом, он не станет больше, чем вы конкретно. В приведенном ниже коде первое число соответствует размеру по горизонтали, а второе — по вертикали. Если у вас нет Qt Designer, я предлагаю загрузить его и настроить свой макет, так как это намного проще, чем делать это просто в коде. self.textEdit.setMaximumSize(QtCore.QSize(16777215, 25)) - person Nester; 25.06.2020