Как обновить QTableWidget?

Моя цель - обновить QTableQidget при добавлении новых контактов. У меня нет проблем с добавлением контактов или их отображением в QTableWidget. Моя проблема в том, что мне нужно выйти из программы, а затем запустить ее снова, чтобы увидеть недавно добавленные контакты. Это способ обновить или обновить QTableWidget, чтобы показать новые контакты, когда они добавляются в базу данных, без необходимости выхода из программы. Я пробовал update() и перерисовывать, и ничего не меняется.

class BrowseContacts(QtGui.QWidget):
    #Display New Contacts Widget
    def __init__(self):
        super(BrowseContacts, self).__init__()
        self.initUI()
        self.contactsData()


    #User Interface
    def initUI(self):
        self.new_layout = QtGui.QGridLayout()

        self.contactsTableWidget = QtGui.QTableWidget()
        self.contactsTableWidget.setColumnCount(10)

        self.contacts_label = ['First Name', 'Last Name', 'Home Phone', 'Cell Phone', 'Business Name', 'Email Address', 'Address', 'City', 'State', 'Zip Code']
        self.contactsTableWidget.setHorizontalHeaderLabels(self.contacts_label)
        self.contactsTableWidget.setSortingEnabled(True)

        self.new_layout.addWidget(self.contactsTableWidget)
        self.setLayout(self.new_layout)

        self.setStyleSheet('QTableWidget::item {background-color: #ffffff; color: #000000}' 'QTableWidget::item:selected {background-color: #3aa8ad; color: #ffffff;}')

    def contactsData(self):
        #Connect to Database
        connection = sqlite3.connect('contacts.db')
        cur = connection.cursor()

        rowcount = cur.execute('''SELECT COUNT(*) FROM contacts''').fetchone()[0]

        self.contactsTableWidget.setRowCount(rowcount)
        cur.execute('''SELECT  * FROM contacts''')

        for row, contacts in enumerate(cur):
            for column, contact in enumerate(contacts):
                self.contactsTableWidget.setItem(row, column, QtGui.QTableWidgetItem(str(contact)))

        cur.close()
        connection.commit()
        connection.close()

Спасибо


person irunintotrees    schedule 30.11.2014    source источник
comment
Не похоже, что чего-то не хватает. Попробуйте добавить несколько отпечатков, чтобы убедиться, что функция действительно работает, и количество строк данных действительно изменяется.   -  person Photon    schedule 30.11.2014
comment
Спасибо. Можете подсказать, как мне это сделать. Что мне распечатать и куда поставить функцию печати. Извините, если это глупый вопрос. Я просто немного смущен.   -  person irunintotrees    schedule 30.11.2014
comment
перед строкой self.contactsTableWidget.setRowCount(rowcount) добавьте что-то вроде print "Setting rowcount to {}".format(rowcount). Он покажет, что функция вызывается и устанавливает новое количество строк. Если вы не видите отпечаток или номер не изменился, вы будете знать, что проблема в другом месте. Надеюсь, это будет что-то подобное.   -  person Photon    schedule 30.11.2014
comment
Как насчет использования QSqlQueryModel (qt-project.org/doc/qt- 4.8/sql-model.html)? Это должно позаботиться обо всех этих вещах за вас и в то же время облегчить вашу жизнь, поскольку вам не придется заниматься sqlite соединением самостоятельно.   -  person rainer    schedule 30.11.2014
comment
Спасибо. Я попробую оба ваших предложения.   -  person irunintotrees    schedule 30.11.2014
comment
у меня такая же проблема как вы ее решили?   -  person Lucky    schedule 24.08.2017


Ответы (1)


Вы вызываете contactsData() один раз, и он заполняет qtablewidget данными из базы данных. Если вы хотите обновить qtablewidget, вам нужно снова вызвать этот метод. Вы можете создать pushbutton и подключить его к contactsData(), чтобы при нажатии этой кнопки контакты перезагружались из вашей базы данных без необходимости выхода из программы.

Если вам нужно, чтобы это было сделано автоматически, вы можете создать таймер для вызова contactsData().

ИЗМЕНИТЬ

просто добавьте эту строку в конце метода contactsData():

QtCore.QTimer.singleShot(10000, self.contactsData)

он будет перезагружать данные каждые 10 секунд

person Aleksandar    schedule 02.12.2014
comment
Думал, что разобрался, как это сделать. Оказывается, я этого не сделал. Не могли бы вы помочь мне в том, как я могу создать таймер для вызова contactData(). Спасибо. - person irunintotrees; 03.12.2014
comment
взгляните на РЕДАКТИРОВАТЬ в моем ответе - person Aleksandar; 03.12.2014