python - 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 对象吗?我认为这意味着
- 创建一个 QHBoxLayout
- 向此布局添加 QGrid
- Grid.cell(0,0) 将是 QForm_a
- Grid.cell(0,1) 将是 QForm_b
解决方案
您可以尝试 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_())
推荐阅读
- python - 如何使用字符串中的位置来更改 Pandas Dataframe 列中的每个字符串
- android - app中camera2 api的兼容性问题
- python - 雷达图 matplotlib - yticks 的位置
- c# - C# - 一种过滤某些类实例字段的干净/高性能方式
- dart - 对 127.0.0.1:80 的 HTTP 请求失败
- asp.net-core - .Net Core 206 移动网络上的部分内容错误
- twilio - Twilio 可编程聊天
- node.js - mongodb/mongoose addToSet 将对象添加到具有相同 id 的数组中
- javascript - 使文本仅在 div 内可见
- json - 想查看json元数据