通过在 PyQt5 中拖动来选择值并将其存储在列表中
Pick values by dragging in PyQt5 and store it in a list
我正在使用 PyQt5 制作一个应用程序,我可以通过从 1 个位置拖动到另一个位置来选择值,如下图所示:
所有选择的值都将存储在如下列表中:
[['4.9', '3.0', '1.4', '0.2'], ['4.7', '3.0', '1.4', '0.2'], .... ['4.4', '2.9', '1.4', '0.2']]
当我拖动选择新值时,它会创建一个新列表并将所有数据存储在该列表中
你们能告诉我如何实现吗?
这是全部代码:
import sys, os
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QTableWidget,
QTableWidgetItem,
QVBoxLayout)
from PyQt5.QtGui import QColor
class App(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt5 Table Example')
self.setGeometry(100, 100, 800, 600)
# Create a table, create a box layout, add the table to box layout and
# then set the overall widget layout to the box layout.
#
self.createTable()
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
self.show()
# Create a table with alphabet header labels. We're attempting to mimic
# the classic spreadsheet look. This goes back to VisiCalc on the Apple ][
# introduced in 1979.
#
def createTable(self):
self.maxRows = 99
self.headerLabels = ["A","B","C","D","E","F","G","H","I","J","K","L",
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(self.maxRows)
self.tableWidget.setColumnCount(len(self.headerLabels))
self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)
# Pre-populate the cells in the spreadsheets with data, strings in
# this example.
#
for row in range(0, self.maxRows):
for col in range(0, len(self.headerLabels)):
self.tableWidget.setItem( row, col,
QTableWidgetItem("Cell {0}{1}".format(self.headerLabels[col], row+1)))
#
# Set every other row a light green color to help readability.
#
# if row % 2 != 0:
# self.tableWidget.item(row,col).setBackground(QColor(220,255,220))
self.tableWidget.move(0,0)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
# Hook various events to their respective callbacks.
#
self.tableWidget.cellClicked.connect(self.cellClicked)
self.tableWidget.cellChanged.connect(self.cellChanged)
self.tableWidget.cellActivated.connect(self.cellActivated)
self.tableWidget.cellEntered.connect(self.cellEntered)
self.tableWidget.cellPressed.connect(self.cellPressed)
def cellClicked(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Clicked:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
def cellChanged(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Changed:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
print(list_value)
def cellActivated(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Activated:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
def cellEntered(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Entered:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
def cellPressed(self):
global list_value
list_value = []
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print('Pressed:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
print(list_value)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
print('PID',os.getpid())
sys.exit(app.exec_())
实际上我得到了什么
我遇到了按钮按下事件、选择事件、释放事件
您可以创建一个属性,它是当通过 itemSelectionChanged 信号通知的选择发生更改时必须修改的所选元素的列表。
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QTableWidget,
QTableWidgetItem,
QVBoxLayout,
)
class App(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5 Table Example")
self.setGeometry(100, 100, 800, 600)
self._selected_lists = []
self.createTable()
lay = QVBoxLayout(self)
lay.addWidget(self.tableWidget)
self.show()
def createTable(self):
self.maxRows = 99
self.headerLabels = [
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
]
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(self.maxRows)
self.tableWidget.setColumnCount(len(self.headerLabels))
self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)
for row in range(0, self.maxRows):
for col in range(0, len(self.headerLabels)):
self.tableWidget.setItem(
row,
col,
QTableWidgetItem(
"Cell {0}{1}".format(self.headerLabels[col], row + 1)
),
)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
self.tableWidget.itemSelectionChanged.connect(self.on_selection_changed)
@pyqtSlot()
def on_selection_changed(self):
self._selected_lists = []
indexes = self.tableWidget.selectedIndexes()
rows = [index.row() for index in indexes]
columns = [index.column() for index in indexes]
row_min, row_max = min(rows), max(rows)
col_min, col_max = min(columns), max(columns)
p = []
for r in range(row_min, row_max + 1):
q = []
for c in range(col_min, col_max + 1):
text = self.tableWidget.model().index(r, c).data()
q.append(text if text is not None else "")
p.append(q)
self._selected_lists = p
print(self.selected_lists)
@property
def selected_lists(self):
return self._selected_lists
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
我正在使用 PyQt5 制作一个应用程序,我可以通过从 1 个位置拖动到另一个位置来选择值,如下图所示:
所有选择的值都将存储在如下列表中:
[['4.9', '3.0', '1.4', '0.2'], ['4.7', '3.0', '1.4', '0.2'], .... ['4.4', '2.9', '1.4', '0.2']]
当我拖动选择新值时,它会创建一个新列表并将所有数据存储在该列表中
你们能告诉我如何实现吗?
这是全部代码:
import sys, os
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QTableWidget,
QTableWidgetItem,
QVBoxLayout)
from PyQt5.QtGui import QColor
class App(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt5 Table Example')
self.setGeometry(100, 100, 800, 600)
# Create a table, create a box layout, add the table to box layout and
# then set the overall widget layout to the box layout.
#
self.createTable()
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
self.show()
# Create a table with alphabet header labels. We're attempting to mimic
# the classic spreadsheet look. This goes back to VisiCalc on the Apple ][
# introduced in 1979.
#
def createTable(self):
self.maxRows = 99
self.headerLabels = ["A","B","C","D","E","F","G","H","I","J","K","L",
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(self.maxRows)
self.tableWidget.setColumnCount(len(self.headerLabels))
self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)
# Pre-populate the cells in the spreadsheets with data, strings in
# this example.
#
for row in range(0, self.maxRows):
for col in range(0, len(self.headerLabels)):
self.tableWidget.setItem( row, col,
QTableWidgetItem("Cell {0}{1}".format(self.headerLabels[col], row+1)))
#
# Set every other row a light green color to help readability.
#
# if row % 2 != 0:
# self.tableWidget.item(row,col).setBackground(QColor(220,255,220))
self.tableWidget.move(0,0)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
# Hook various events to their respective callbacks.
#
self.tableWidget.cellClicked.connect(self.cellClicked)
self.tableWidget.cellChanged.connect(self.cellChanged)
self.tableWidget.cellActivated.connect(self.cellActivated)
self.tableWidget.cellEntered.connect(self.cellEntered)
self.tableWidget.cellPressed.connect(self.cellPressed)
def cellClicked(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Clicked:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
def cellChanged(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Changed:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
print(list_value)
def cellActivated(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Activated:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
def cellEntered(self):
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print(' Entered:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
def cellPressed(self):
global list_value
list_value = []
for currentQTableWidgetItem in self.tableWidget.selectedItems():
print('Pressed:', currentQTableWidgetItem.row(),
currentQTableWidgetItem.column(),
currentQTableWidgetItem.text())
list_value.append(currentQTableWidgetItem.text())
print(list_value)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
print('PID',os.getpid())
sys.exit(app.exec_())
实际上我得到了什么
我遇到了按钮按下事件、选择事件、释放事件
您可以创建一个属性,它是当通过 itemSelectionChanged 信号通知的选择发生更改时必须修改的所选元素的列表。
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QTableWidget,
QTableWidgetItem,
QVBoxLayout,
)
class App(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5 Table Example")
self.setGeometry(100, 100, 800, 600)
self._selected_lists = []
self.createTable()
lay = QVBoxLayout(self)
lay.addWidget(self.tableWidget)
self.show()
def createTable(self):
self.maxRows = 99
self.headerLabels = [
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
]
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(self.maxRows)
self.tableWidget.setColumnCount(len(self.headerLabels))
self.tableWidget.setHorizontalHeaderLabels(self.headerLabels)
for row in range(0, self.maxRows):
for col in range(0, len(self.headerLabels)):
self.tableWidget.setItem(
row,
col,
QTableWidgetItem(
"Cell {0}{1}".format(self.headerLabels[col], row + 1)
),
)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
self.tableWidget.itemSelectionChanged.connect(self.on_selection_changed)
@pyqtSlot()
def on_selection_changed(self):
self._selected_lists = []
indexes = self.tableWidget.selectedIndexes()
rows = [index.row() for index in indexes]
columns = [index.column() for index in indexes]
row_min, row_max = min(rows), max(rows)
col_min, col_max = min(columns), max(columns)
p = []
for r in range(row_min, row_max + 1):
q = []
for c in range(col_min, col_max + 1):
text = self.tableWidget.model().index(r, c).data()
q.append(text if text is not None else "")
p.append(q)
self._selected_lists = p
print(self.selected_lists)
@property
def selected_lists(self):
return self._selected_lists
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())