什么是表單:
QFormLayout 描述:
主要就是用來管理輸入控件及其關聯標簽的形式!
它以兩列的形式列出,左列由標簽組成,右列由“字段” 小部件(行編輯器,旋轉框等)組成。
QFormLayout 功能作用:
構造函數:

from PyQt5.Qt import * #剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400,400) self.set_ui() def set_ui(self): name_label= QLabel("姓名:") age_label= QLabel("年齡:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() formLayout = QFormLayout() self.setLayout(formLayout) if __name__ == '__main__': app =QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
行操作:
添加行:
前兩個方法:

from PyQt5.Qt import * #剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400,400) self.set_ui() def set_ui(self): name_label= QLabel("姓名:") age_label= QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() #添加行 formLayout.addRow(name_label,name_lineEdit) formLayout.addRow(age_label,age_spinBox) #添加子布局 formLayout.addRow(sex_label,h_layout) formLayout.addRow(submit_btn) self.setLayout(formLayout) return None if __name__ == '__main__': app =QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
第三個和第四個:

from PyQt5.Qt import * #剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400,400) self.set_ui() def set_ui(self): # name_label= QLabel("姓名:") # age_label= QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() #添加行 formLayout.addRow("姓名(&n)",name_lineEdit) #這里會自動的添加快捷方式 formLayout.addRow("年齡(&a)",age_spinBox) #添加子布局 formLayout.addRow(sex_label,h_layout) formLayout.addRow(submit_btn) self.setLayout(formLayout) return None if __name__ == '__main__': app =QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
插入行:
和上面差不多,就是多了個索引而已!
獲取行的信息:
如何確定一個控件呢?它要指定哪一行,哪個列,這就要借助角色來幫助了。
三個角色:

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) # 行的信息 print(formLayout.rowCount()) print(formLayout.getWidgetPosition(age_label)) #第一列是 標簽角色 0 QFormLayout.LabelRole #第二列是 輸入框角色 1 QFormLayout.FieldRole #跨越標簽和輸入框的角色 2 QFormLayout.SpanningRole self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
修改行:
它就是先確定一個行,一個列(角色) ,然后操作它就行了

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 # formLayout.addRow(name_label, name_lineEdit) # formLayout.addRow(age_label, age_spinBox) # # 添加子布局 # formLayout.addRow(sex_label, h_layout) # formLayout.addRow(submit_btn) #修改行 #setWidget #setLayout formLayout.setWidget(0,QFormLayout.LabelRole,name_label) formLayout.setWidget(0,QFormLayout.FieldRole,name_lineEdit) formLayout.setWidget(1,QFormLayout.LabelRole,sex_label) formLayout.setLayout(1,QFormLayout.FieldRole,h_layout) #注:如果單元格位置被占用,則設置不成功 self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
移除行(刪除子控件):
移除行(不刪除子控件):

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #移除行 刪除控件 # formLayout.removeRow(1) #移除行 不刪除控件 ret = formLayout.takeRow(1) #它的返回值是 QFormLayout.TakeRowResult 對象 #如何了解它的返回值呢? 沒有文檔時,可以通過打印dir() # print(dir(QFormLayout.TakeRowResult)) #'fieldItem', 'labelItem' 重要的屬性 # print(ret.labelItem) #QWidgetItem # print(ret.fieldItem) #QWidgetItem # QWidgetItem # print(ret.labelItem.widget()) # print(ret.fieldItem.widget()) self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #移除行 刪除控件 # formLayout.removeRow(age_label) #此時移除的也是一整行 #移除一個控件 # formLayout.removeWidget(age_label) self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
標簽操作

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow("姓名", name_lineEdit) #問題是:如何修改 姓名 formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #標簽操作 #此時,可以根據后面的field 找到 label mylabel = formLayout.labelForField(name_lineEdit) mylabel.setText("姓名(Name)") self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
行的包裝策略

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #行的包裝策略 #默認是左右 擺放,縮放時也不換行 # formLayout.setRowWrapPolicy(QFormLayout.WrapLongRows) # formLayout.setRowWrapPolicy(QFormLayout.WrapAllRows)#字段總是位與標簽的下方 self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
對齊方式
表單的對齊,和表單中的標簽的對齊

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #對齊 #表單的對齊 formLayout.setFormAlignment(Qt.AlignCenter) #表單中的標簽的對齊 formLayout.setLabelAlignment(Qt.AlignCenter) self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
間距

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #間距 formLayout.setHorizontalSpacing(20) formLayout.setVerticalSpacing(60) self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
字段增長策略
默認情況是,當窗口拉伸時,右面的field 也會跟着被拉伸,

from PyQt5.Qt import * # 剛開始學習可以這樣一下導入 import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QFormLayout 的學習") self.resize(400, 400) self.set_ui() def set_ui(self): name_label = QLabel("姓名:") age_label = QLabel("年齡:") sex_label = QLabel("性別:") name_lineEdit = QLineEdit() age_spinBox = QSpinBox() male_radioButton = QRadioButton("男") female_radioButton = QRadioButton("女") h_layout = QHBoxLayout() h_layout.addWidget(male_radioButton) h_layout.addWidget(female_radioButton) submit_btn = QPushButton("提交") formLayout = QFormLayout() # 添加行 formLayout.addRow(name_label, name_lineEdit) formLayout.addRow(age_label, age_spinBox) # 添加子布局 formLayout.addRow(sex_label, h_layout) formLayout.addRow(submit_btn) #字段增長策略 formLayout.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint) self.setLayout(formLayout) return None if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
布局項操作(了解)
它涉及到自定義布局(使用的很少)
總結:
這就是表單布局管理器的內容 QFormLayout :下面是網格布局QGridLayout :https://www.cnblogs.com/zach0812/p/11401724.html