如何使用 QDate 选择更新 QTableView 单元格?
How to update a QTableView cell with a QDate selection?
我已将 QDateEdit 委托添加到 QTableView 单元格并希望用日期更新它们,但我无法找出正确的连接语法。 dateChanged.connect(item.setText)不行,因为QDateEdit returns一个QDate对象,需要用[=转换成字符串26=]toString,但我不知道在connect()语句中在哪里以及如何压缩它。
这是我目前拥有的:
main.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>350</width>
<height>239</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QWidget" name="formLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>341</width>
<height>231</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="1">
<widget class="QPushButton" name="btnPopulate">
<property name="text">
<string>Populate Table</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QTableView" name="tableView"/>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
from PyQt5 import uic
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QDialog, QApplication, QDateEdit
from PyQt5.QtCore import QDate
class GUI(QDialog):
def __init__(self):
super(GUI, self).__init__()
dirname = os.path.dirname(os.path.abspath(__file__))
uic.loadUi(os.path.join(dirname,'main.ui'), self)
# button
self.btnPopulate.clicked.connect(self.populate)
# table model
self.header = ['col1', 'col2', 'col3']
self.QSModel = QStandardItemModel()
self.QSModel.setColumnCount(3)
self.QSModel.setHorizontalHeaderLabels(self.header)
self.tableView.setModel(self.QSModel)
def populate(self):
row = self.QSModel.rowCount()
for x in range(7):
self.QSModel.insertRow(row)
self.QSModel.setData(self.QSModel.index(row, 0), 'data')
self.QSModel.item(row, 0).setEditable(True)
self.QSModel.setData(self.QSModel.index(row, 1), 'data')
self.QSModel.item(row, 1).setEditable(True)
if x % 2 == 0:
self.QSModel.setData(self.QSModel.index(row, 2), '2018-01-06')
item = self.tableView.model().item(row, 2)
date = self.QSModel.data(self.QSModel.index(row, 2))
deDelegate = QDateEdit()
deDelegate.setCalendarPopup(True)
deDelegate.setDisplayFormat('yyyy-MM-dd')
myQDate = QDate.fromString(date, 'yyyy-MM-dd')
deDelegate.setDate(myQDate)
self.tableView.setIndexWidget(item.index(), deDelegate)
#deDelegate.dateChanged.connect(item.setText) doesn't work
else:
self.QSModel.setData(self.QSModel.index(row, 2), 'data')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = GUI()
window.show()
sys.exit(app.exec_())
我有以下问题:
什么是正确的 connect() 语法来实现我想要的。
AFAIK,yyyy-MM-dd 与 Qt.ISODate 格式相同,但我无法找出正确的导入语法。 (我尝试从 PyQt5.QtCore 导入它,但没有用。)如果我可以使用 Qt.ISODate 而不是 yyyy-MM- dd:正确的导入语法是什么?
What's the correct connect() syntax to achieve what I want.
dateChanged
信号returns一个QDate
类型的对象,它不是字符串所以你不能将它赋给setText()
,为此你必须使用toString()
:
deDelegate.dateChanged.connect(lambda date, it=item: it.setText(date.toString(Qt.ISODate)))
或者:
deDelegate.dateChanged.connect(lambda date, it=item: it.setText(date.toString("yyyy-MM-dd")))
AFAIK, yyyy-MM-dd is the same as Qt.ISODate format, but I can't figure out the proper import syntax. (I tried importing it from PyQt5.QtCore, but it didn't work.) If I could use Qt.ISODate instead of yyyy-MM-dd: what's the correct import syntax?
Qt
是 QtCore
的一部分,因此您必须按如下方式导入它:from PyQt5.QtCore import Qt
,示例:
from PyQt5.QtCore import QDate, Qt
if __name__ == '__main__':
today = QDate.currentDate()
print(today.toString(Qt.ISODate))
我已将 QDateEdit 委托添加到 QTableView 单元格并希望用日期更新它们,但我无法找出正确的连接语法。 dateChanged.connect(item.setText)不行,因为QDateEdit returns一个QDate对象,需要用[=转换成字符串26=]toString,但我不知道在connect()语句中在哪里以及如何压缩它。
这是我目前拥有的:
main.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>350</width>
<height>239</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QWidget" name="formLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>341</width>
<height>231</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="1">
<widget class="QPushButton" name="btnPopulate">
<property name="text">
<string>Populate Table</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QTableView" name="tableView"/>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
from PyQt5 import uic
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QDialog, QApplication, QDateEdit
from PyQt5.QtCore import QDate
class GUI(QDialog):
def __init__(self):
super(GUI, self).__init__()
dirname = os.path.dirname(os.path.abspath(__file__))
uic.loadUi(os.path.join(dirname,'main.ui'), self)
# button
self.btnPopulate.clicked.connect(self.populate)
# table model
self.header = ['col1', 'col2', 'col3']
self.QSModel = QStandardItemModel()
self.QSModel.setColumnCount(3)
self.QSModel.setHorizontalHeaderLabels(self.header)
self.tableView.setModel(self.QSModel)
def populate(self):
row = self.QSModel.rowCount()
for x in range(7):
self.QSModel.insertRow(row)
self.QSModel.setData(self.QSModel.index(row, 0), 'data')
self.QSModel.item(row, 0).setEditable(True)
self.QSModel.setData(self.QSModel.index(row, 1), 'data')
self.QSModel.item(row, 1).setEditable(True)
if x % 2 == 0:
self.QSModel.setData(self.QSModel.index(row, 2), '2018-01-06')
item = self.tableView.model().item(row, 2)
date = self.QSModel.data(self.QSModel.index(row, 2))
deDelegate = QDateEdit()
deDelegate.setCalendarPopup(True)
deDelegate.setDisplayFormat('yyyy-MM-dd')
myQDate = QDate.fromString(date, 'yyyy-MM-dd')
deDelegate.setDate(myQDate)
self.tableView.setIndexWidget(item.index(), deDelegate)
#deDelegate.dateChanged.connect(item.setText) doesn't work
else:
self.QSModel.setData(self.QSModel.index(row, 2), 'data')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = GUI()
window.show()
sys.exit(app.exec_())
我有以下问题:
什么是正确的 connect() 语法来实现我想要的。
AFAIK,yyyy-MM-dd 与 Qt.ISODate 格式相同,但我无法找出正确的导入语法。 (我尝试从 PyQt5.QtCore 导入它,但没有用。)如果我可以使用 Qt.ISODate 而不是 yyyy-MM- dd:正确的导入语法是什么?
What's the correct connect() syntax to achieve what I want.
dateChanged
信号returns一个QDate
类型的对象,它不是字符串所以你不能将它赋给setText()
,为此你必须使用toString()
:
deDelegate.dateChanged.connect(lambda date, it=item: it.setText(date.toString(Qt.ISODate)))
或者:
deDelegate.dateChanged.connect(lambda date, it=item: it.setText(date.toString("yyyy-MM-dd")))
AFAIK, yyyy-MM-dd is the same as Qt.ISODate format, but I can't figure out the proper import syntax. (I tried importing it from PyQt5.QtCore, but it didn't work.) If I could use Qt.ISODate instead of yyyy-MM-dd: what's the correct import syntax?
Qt
是 QtCore
的一部分,因此您必须按如下方式导入它:from PyQt5.QtCore import Qt
,示例:
from PyQt5.QtCore import QDate, Qt
if __name__ == '__main__':
today = QDate.currentDate()
print(today.toString(Qt.ISODate))