布局管理之 QFormLayout (表單布局)


什么是表單:

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_())
View Code

 

行操作:

添加行:

前兩個方法:

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_())
View Code

第三個和第四個:

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_())
View Code

 

插入行:

和上面差不多,就是多了個索引而已! 

 

獲取行的信息

如何確定一個控件呢?它要指定哪一行,哪個列,這就要借助角色來幫助了。

三個角色:

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_())
View Code

 

修改行:

它就是先確定一個行,一個列(角色)  ,然后操作它就行了

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_())
View Code

 

 

移除行(刪除子控件):

移除行(不刪除子控件):

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_())
View Code

 

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_())
View Code

 

 

標簽操作

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_())
View Code

 

行的包裝策略

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_())
View Code

 

對齊方式

表單的對齊,和表單中的標簽的對齊 

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_())
View Code

 

間距

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_())
View Code

 

字段增長策略

默認情況是,當窗口拉伸時,右面的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_())
View Code

 

布局項操作(了解)

它涉及到自定義布局(使用的很少)

 

 

 

總結:

這就是表單布局管理器的內容 QFormLayout :下面是網格布局QGridLayout  :https://www.cnblogs.com/zach0812/p/11401724.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM