如何更新 QTableWidget?

4

我的目标是在添加新联系人时更新QTableWidget。我没有添加联系人或者他们出现在QTableWidget上的问题。我的问题是,我必须退出程序然后重新启动才能看到新添加的联系人。有没有一种方法可以在将新联系人添加到数据库时更新或刷新QTableWidget以显示它们而无需退出程序?我尝试过update()和repaint,但没有任何变化。

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()

Thank You


看起来不像是缺少什么东西。尝试添加一些打印语句以验证函数是否实际运行,并且数据行数是否实际更改。 - Photon
谢谢。你能给我一点提示吗?我该打印什么,把打印函数放在哪里?如果这是个愚蠢的问题,对不起,我有点困惑。 - irunintotrees
在行 self.contactsTableWidget.setRowCount(rowcount) 之前添加类似于 print "Setting rowcount to {}".format(rowcount) 的内容。这将显示函数被调用并设置了新的行数。如果您没有看到打印输出,或者数字没有改变,那么您就知道问题出在其他地方了。希望是这样的情况。 - Photon
4
使用 QSqlQueryModel(http://qt-project.org/doc/qt-4.8/sql-model.html)怎么样?这个模型应该能够为您处理所有这些问题,并且同时使您的生活更轻松,因为您不必自己处理 sqlite 连接。 - rainer
谢谢。我会尝试你们两个的建议。 - irunintotrees
我有同样的问题,你是怎么解决的? - Lucky
1个回答

3
你只需要调用一次contactsData()方法,它就会从数据库中获取数据并填充到qtablewidget中。如果你想刷新qtablewidget,你需要再次调用该方法。你可以创建一个pushbutton并将其连接到contactsData(),这样当你按下该按钮时,联系人将重新从数据库中加载,而无需退出程序。
如果你需要自动完成这个过程,你可以创建一个定时器来调用contactsData()编辑 只需在contactsData()方法的末尾添加这一行即可:
QtCore.QTimer.singleShot(10000, self.contactsData)

它将每10秒重新加载数据。


1
我以为我已经想出如何做那件事了。结果是我没有。你能帮我解决一下如何创建一个定时器来调用contactsData()吗?谢谢。 - irunintotrees
1
请查看我的回答中的“EDIT”。 - Aleksandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接