sqlite3 table 到 QTableWidget、sqlite3、PyQt5
sqlite3 table into QTableWidget, sqlite3, PyQt5
我已经创建了一个程序来管理数据库中的 tables,现在我正在尝试为它制作一个图形用户界面,我认为最简单的方法是使用 Qt Designer 然后使用 PyQt5 将其转换为 python,所以我做到了,我知道如何将函数绑定到按钮,但我不知道更复杂的事情,比如将 table 列和行显示到 Qtable小部件,假设我有下面的数据库:
import sqlite3
conn = sqlite3.connect('realscheduler.db')
c = conn.cursor()
c.execute('pragma foreign_keys = ON;')
conn.commit()
有一个 table 命名的教授,里面有 6 列,我该怎么做才能在下面的 Qtable 小部件上显示这个 table、它的列和行?
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'testui.ui'
#
# Created by: PyQt5 UI code generator 5.4.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.verticalLayout_2.addWidget(self.tableWidget)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_2)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_2)
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(0)
self.tableWidget_2.setRowCount(0)
self.horizontalLayout_2.addWidget(self.tableWidget_2)
self.tabWidget.addTab(self.tab_2, "")
self.verticalLayout.addWidget(self.tabWidget)
self.horizontalLayout.addLayout(self.verticalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
在我回答这个问题之前,我强烈建议您在 Qt Designer 中打开您的 UI 文件,并将您的对象名称从 tableWidget_2
和 pushButton
更改为更合适的名称你会把自己逼疯的。
其次,PyQt 提供了一个完整的 API 来处理名为 QtSql 的数据库。您可以像这样访问 api:
from PyQt5.QtSql import (QSqlDatabase, QSqlQuery) #and so on.
吐槽完毕。我现在就回答你的问题。
QTableWidgets 很难使用并且需要一些东西:
- 一个计数器标志
- 行数
- 列数
- 数据(显然)
要将数据插入 table,您可以这样做。
def add_values(self):
self.count = self.count + 1 # this is incrementing counter
self.tableWidget_2.insertRow(self.count)
self.tableWidget_2.setRowCount(self.count)
# these are the items in the database
item = [column1, column2, column3]
# here we are adding 3 columns from the db table to the tablewidget
for i in range(3):
self.tableWidget_2.setItem(self.count - 1, i, QTableWidgetItem(item[i]))
但是,如果您只想将数据加载到 QTableWidget 中,您可以这样做并在设置中调用它:
def load_initial_data(self):
# where c is the cursor
self.c.execute('''SELECT * FROM table ''')
rows = self.c.fetchall()
for row in rows:
inx = rows.index(row)
self.tableWidget_2.insertRow(inx)
# add more if there is more columns in the database.
self.tableWidget_2.setItem(inx, 0, QTableWidgetItem(row[1]))
self.tableWidget_2.setItem(inx, 1, QTableWidgetItem(row[2]))
self.tableWidget_2.setItem(inx, 2, QTableWidgetItem(row[3]))
我已经创建了一个程序来管理数据库中的 tables,现在我正在尝试为它制作一个图形用户界面,我认为最简单的方法是使用 Qt Designer 然后使用 PyQt5 将其转换为 python,所以我做到了,我知道如何将函数绑定到按钮,但我不知道更复杂的事情,比如将 table 列和行显示到 Qtable小部件,假设我有下面的数据库:
import sqlite3
conn = sqlite3.connect('realscheduler.db')
c = conn.cursor()
c.execute('pragma foreign_keys = ON;')
conn.commit()
有一个 table 命名的教授,里面有 6 列,我该怎么做才能在下面的 Qtable 小部件上显示这个 table、它的列和行?
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'testui.ui'
#
# Created by: PyQt5 UI code generator 5.4.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.verticalLayout_2.addWidget(self.tableWidget)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_2)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_2)
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(0)
self.tableWidget_2.setRowCount(0)
self.horizontalLayout_2.addWidget(self.tableWidget_2)
self.tabWidget.addTab(self.tab_2, "")
self.verticalLayout.addWidget(self.tabWidget)
self.horizontalLayout.addLayout(self.verticalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
在我回答这个问题之前,我强烈建议您在 Qt Designer 中打开您的 UI 文件,并将您的对象名称从 tableWidget_2
和 pushButton
更改为更合适的名称你会把自己逼疯的。
其次,PyQt 提供了一个完整的 API 来处理名为 QtSql 的数据库。您可以像这样访问 api:
from PyQt5.QtSql import (QSqlDatabase, QSqlQuery) #and so on.
吐槽完毕。我现在就回答你的问题。
QTableWidgets 很难使用并且需要一些东西:
- 一个计数器标志
- 行数
- 列数
- 数据(显然)
要将数据插入 table,您可以这样做。
def add_values(self):
self.count = self.count + 1 # this is incrementing counter
self.tableWidget_2.insertRow(self.count)
self.tableWidget_2.setRowCount(self.count)
# these are the items in the database
item = [column1, column2, column3]
# here we are adding 3 columns from the db table to the tablewidget
for i in range(3):
self.tableWidget_2.setItem(self.count - 1, i, QTableWidgetItem(item[i]))
但是,如果您只想将数据加载到 QTableWidget 中,您可以这样做并在设置中调用它:
def load_initial_data(self):
# where c is the cursor
self.c.execute('''SELECT * FROM table ''')
rows = self.c.fetchall()
for row in rows:
inx = rows.index(row)
self.tableWidget_2.insertRow(inx)
# add more if there is more columns in the database.
self.tableWidget_2.setItem(inx, 0, QTableWidgetItem(row[1]))
self.tableWidget_2.setItem(inx, 1, QTableWidgetItem(row[2]))
self.tableWidget_2.setItem(inx, 2, QTableWidgetItem(row[3]))