首页 > 解决方案 > Hwo用多行多列实现QFormLayout

问题描述

如何实现具有多行和多列的 from?我目前正在使用 QFormLayout ,其中每一行都是 QLabel 和 QLineEdit ,如

#!/usr/bin/python3

from PyQt5.QtWidgets import (QApplication, QWidget, QFormLayout, QLabel,
        QLineEdit)

import sys

app = QApplication([])
win = QWidget()
layout = QFormLayout()
layout.addRow('Name:', QLineEdit())
layout.addRow('Phone:', QLineEdit())
win.setLayout(layout)
win.setGeometry(50,50,400,200)
win.show()
app.exec_()

呈现

在此处输入图像描述

因此,如果我想要一个具有多行和多列的表单,我是否必须执行类似的操作

#!/usr/bin/python3

from PyQt5.QtWidgets import (QApplication, QWidget, QFormLayout, QLabel,
        QLineEdit, QGridLayout)

import sys

app = QApplication([])
win = QWidget()
layout = QGridLayout()
nameLabel = QLabel('Name:');    layout.addWidget(nameLabel, 0, 0)
nameInput = QLineEdit();        layout.addWidget(nameInput, 0, 1)
phoneLabel = QLabel('Phone:');  layout.addWidget(phoneLabel, 1, 0)
phoneInput = QLineEdit();       layout.addWidget(phoneInput, 1, 1)
addrLabel = QLabel('Address:'); layout.addWidget(addrLabel, 0, 2)
addrInput = QLineEdit();        layout.addWidget(addrInput, 0, 3)
zipLabel = QLabel('Zip:');      layout.addWidget(zipLabel, 1, 2)
zipInput = QLineEdit();         layout.addWidget(zipInput, 1, 3)
win.setLayout(layout)
win.setGeometry(50,50,400,200)
win.show()
app.exec_()

呈现

在此处输入图像描述

这是唯一的方法...这是不可扩展的。

请原谅术语屠戮......我可以拥有一个 QGrid 类型的对象,其中包含两个水平对齐的 QForm 对象吗?我认为这意味着

标签: pythonpyqtpyqt5

解决方案


您可以尝试 Qtable 小部件:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget, QTableWidgetItem, QVBoxLayout
# from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'TABLE WIDGET'
        self.left = 0
        self.top = 0
        self.width = 300
        self.height = 200
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()

        # Add box layout, add table to box layout and add box layout to widget
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)

        # Show widget
        self.show()

    def createTable(self):
        # Create table
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1, 0, QTableWidgetItem("Cell (2,1)"))
        self.tableWidget.setItem(1, 1, QTableWidgetItem("Cell (2,2)"))
        self.tableWidget.setItem(2, 0, QTableWidgetItem("Cell (3,1)"))
        self.tableWidget.setItem(2, 1, QTableWidgetItem("Cell (3,2)"))
        self.tableWidget.setItem(3, 0, QTableWidgetItem("Cell (4,1)"))
        self.tableWidget.setItem(3, 1, QTableWidgetItem("Cell (4,2)"))
        self.tableWidget.move(0, 0)

        # table selection change
        self.tableWidget.doubleClicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

推荐阅读