PyQt5:QLineEdit 正在大量扩展并破坏我的网格布局
PyQt5: QLineEdit is massively expanding and ruining my grid layout
请原谅这个可能非常简单的问题,我是 PyQt5 的新手,我真的很难理解它是如何工作的。
我正在尝试为我的程序制作一个粗略的现成选项菜单,作为其中的一部分,我想为用户输入添加一些小文本框。我一直在使用网格布局系统来让自己更轻松,但 QLineEdit 文本框似乎试图水平扩展并挤压其他所有内容。
我的 window 没有文本框时的样子
我的window文本框的样子
我看过关于使用 setHorizontalPolicy 的讨论,但我不理解文档(并且尝试手动解决它是行不通的)。
(理想情况下,我希望我的 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,您可以在属性 编辑器中将“Horizontal Policy”更改为“Maximum”。这似乎违反直觉,但 Maximum 将使您的标签仅扩展到文本实际占用的 space 。要在没有 Qt Designer 的情况下仅使用代码来做到这一点,我认为这可能有效:
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
self.label.setSizePolicy(sizePolicy)
将 'label' 替换为您要修改的标签 Widget。
请原谅这个可能非常简单的问题,我是 PyQt5 的新手,我真的很难理解它是如何工作的。
我正在尝试为我的程序制作一个粗略的现成选项菜单,作为其中的一部分,我想为用户输入添加一些小文本框。我一直在使用网格布局系统来让自己更轻松,但 QLineEdit 文本框似乎试图水平扩展并挤压其他所有内容。
我的 window 没有文本框时的样子
我的window文本框的样子
我看过关于使用 setHorizontalPolicy 的讨论,但我不理解文档(并且尝试手动解决它是行不通的)。
(理想情况下,我希望我的 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,您可以在属性 编辑器中将“Horizontal Policy”更改为“Maximum”。这似乎违反直觉,但 Maximum 将使您的标签仅扩展到文本实际占用的 space 。要在没有 Qt Designer 的情况下仅使用代码来做到这一点,我认为这可能有效:
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
self.label.setSizePolicy(sizePolicy)
将 'label' 替换为您要修改的标签 Widget。