【问题标题】:How to update QTableWidget?如何更新 QTableWidget?
【发布时间】:2015-01-28 12:28:22
【问题描述】:

我的目标是在添加新联系人时更新 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()

谢谢

【问题讨论】:

  • 看起来并没有缺少什么。尝试添加一些打印来验证函数是否实际运行,数据行数是否实际发生变化
  • 谢谢。你能给我一个关于我如何去做的提示吗?我要打印什么以及将打印功能放在哪里。对不起,如果这是一个愚蠢的问题。我只是有点困惑。
  • self.contactsTableWidget.setRowCount(rowcount) 行之前添加print "Setting rowcount to {}".format(rowcount) 之类的内容。它将显示该函数已被调用并设置新的行数。如果您没有看到打印,或者数字没有更改,您就会知道问题出在其他地方。希望会是这样。
  • 使用QSqlQueryModel (qt-project.org/doc/qt-4.8/sql-model.html) 怎么样?这应该为您处理所有这些事情,同时让您的生活更轻松,因为您不必自己处理sqlite 连接。
  • 谢谢。我会尝试你的两个建议。

标签: python sqlite pyqt pyside qtablewidget


【解决方案1】:

您调用contactsData() 一次,它会用数据库中的数据填充qtablewidget。如果你想刷新qtablewidget你需要再次调用那个方法。您可以创建pushbutton 并将其连接到contactsData(),因此当您按下该按钮时,联系人将从您的数据库中重新加载,而无需退出程序。

如果您需要自动完成,您可以创建计时器来调用contactsData()

编辑

只需在 contactsData() 方法的末尾添加这一行:

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

它将每 10 秒重新加载一次数据

【讨论】:

  • 以为我已经弄清楚了如何做到这一点。结果我没有。您能否帮助我了解如何创建一个计时器来调用contactsData()。谢谢。
  • 看看我的回答中的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多