从QListView中获取选定项的数据

2 投票
3 回答
6010 浏览
提问于 2025-04-17 10:36

我用QSqlTableModel填充了一个QListView。

  projectModel = QSqlTableModel()
  projectModel.setTable("project")
  projectModel.select()

  projectView = QListView()
  projectView.setModel(projectModel)
  projectView.setModelColumn(1)
  • 稍微修改一下我的表述。 -

假设我的QSqlTableModel有3列。第(0)列是id,第(1)列是名字,第(2)列是颜色。

在我的QListView中,我只显示第1列,也就是名字。然后我选中了一个项目。请问我怎么才能获取到这个项目的id和颜色呢?

抱歉,我还是个初学者。太初学了,读文档都看不懂 :(

3 个回答

0

你可以使用模型的 selectedIndexes() 方法来获取被选中项目的索引,方法类似于下面这样:

idx = self.projectView.selectionModel().selectedRows()

接着,你可以通过循环这些索引(idx),来获取你需要的值,方法如下:

for rec in idx:
    entry = rec.row()
    val = self.projectModel.record(entry).field(x).value()

这里的 x 是你想要获取的列的编号。

现在 val 是一个 QVariant 类型,你可以对它进行进一步的处理。

3

在我的QListView中,我只显示第一列,也就是名字。然后我选中了一个项目。请问我怎么才能获取到这个项目的ID和颜色呢?

请看下面的例子。你可以在QListView的“点击”事件中添加一个函数。这样就可以获取到选中的行。

from PyQt4.QtSql import QSqlDatabase,QSqlTableModel
from PyQt4.QtGui import QListView,QApplication
import sys

def listclicked(index):
    row = index.row()
    print "id = %s" % projectModel.record(row).field(0).value().toString()
    print "country = %s" % projectModel.record(row).field(2).value().toString()

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("sqlitedb.rdb")
db.open()

projectModel = QSqlTableModel()
projectModel.setTable("info")
projectModel.select()

projectView = QListView()
projectView.setModel(projectModel)
projectView.setModelColumn(1)
projectView.clicked.connect(listclicked)
projectView.show()

app.exec_()
6

虽然我不太明白你具体想做什么,但我可以给你解答你问的两个问题。

比如说,我们有一个名为 "sqlitedb.rdb" 的sqlite3数据库,还有一个表叫 "info",

CREATE TABLE info (
id integer  PRIMARY KEY AUTOINCREMENT DEFAULT NULL,
name TEXT(20) DEFAULT NULL,
country TEXT(20) DEFAULT NULL,
age integer)

里面有一些数据,

INSERT INTO info (name,country,age) VALUES ('Leroy Hale','San Marino','46');
INSERT INTO info (name,country,age) VALUES ('William Coleman','Namibia','50');
INSERT INTO info (name,country,age) VALUES ('Phelan Waller','Belgium','43');
INSERT INTO info (name,country,age) VALUES ('Kato Martin','Virgin Islands, British','21');
INSERT INTO info (name,country,age) VALUES ('Jameson Mccoy','United Arab Emirates','45');
INSERT INTO info (name,country,age) VALUES ('Fulton Reeves','Belarus','34');
INSERT INTO info (name,country,age) VALUES ('Calvin Love','Morocco','28');
INSERT INTO info (name,country,age) VALUES ('Peter Solis','Bhutan','31');
INSERT INTO info (name,country,age) VALUES ('Connor Stephenson','Dominican Republic','26');
INSERT INTO info (name,country,age) VALUES ('Aristotle Smith','Chad','45');

现在,

我只想显示id和名字(第0列和第1列),我该怎么做呢?

要做到这一点,你可以,

from PyQt4.QtSql import QSqlQueryModel,QSqlDatabase,QSqlQuery
from PyQt4.QtGui import QTableView,QApplication
import sys

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("sqlitedb.rdb")
db.open()

projectModel = QSqlQueryModel()
projectModel.setQuery("select name,age from info",db)

projectView = QTableView()
projectView.setModel(projectModel)

projectView.show()
app.exec_()

通过查询来设置你想显示的字段/列。

还有,

我怎么能从我选择的项目中获取不同列的信息呢?

你可以在查询的结果中浏览数据,举个例子,

from PyQt4.QtSql import QSqlDatabase,QSqlQuery
from PyQt4.QtCore import QCoreApplication
import sys

app = QCoreApplication(sys.argv)

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("sqlitedb.rdb")
db.open()

query = QSqlQuery()
query.exec_("select * from info")
while (query.next()):
    id = query.value(0).toInt()
    name = query.value(1).toString()
    country = query.value(2).toString()
    age = query.value(3).toInt()

    print "name = %s \ncountry = %s" % (name,country)

app.exec_()

你可以循环遍历查询结果,获取数据。

撰写回答