Как обновить ячейку QTableView с выбором QDate?

Я добавил делегатов QDateEdit в ячейки QTableView и хочу обновить их датой, но я не могу определить правильный синтаксис соединения. dateChanged.connect (item.setText) не работает, потому что QDateEdit возвращает объект QDate, который необходимо преобразовать в строку с помощью 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_())

У меня есть следующие вопросы:

  1. Какой правильный синтаксис connect() для достижения того, что я хочу.

  2. AFAIK, yyyy-MM-dd такой же, как формат Qt.ISODate, но я не могу понять правильный синтаксис импорта. (Я попытался импортировать его из PyQt5.QtCore, но он не работал.) Если бы я мог использовать Qt.ISODate вместо yyyy-MM-dd: какой правильный синтаксис импорта?

1 ответ

Решение

Какой правильный синтаксис connect() для достижения того, что я хочу.

dateChanged сигнал возвращает объект типа 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 такой же, как формат Qt.ISODate, но я не могу понять правильный синтаксис импорта. (Я попытался импортировать его из PyQt5.QtCore, но он не работал.) Если бы я мог использовать Qt.ISODate вместо yyyy-MM-dd: какой правильный синтаксис импорта?

Qt это часть QtCore, поэтому вы должны импортировать его следующим образом: from PyQt5.QtCore import Qt, пример:

from PyQt5.QtCore import QDate, Qt

if __name__ == '__main__':
    today = QDate.currentDate()
    print(today.toString(Qt.ISODate))
Другие вопросы по тегам