Возможно ли найти строку индекса и значения с помощью QRegExp с именем поиска?

#python #python-3.x #pyqt5 #qregexp #qsortfilterproxymodel

#python #python-3.x #pyqt5 #qregexp #qsortfilterproxymodel

Вопрос:

Я хочу найти строку-индекс с искомым словом, используя с QSortFilterProxyModel помощью и QtCore.QRegExp . Я хочу создать список со столбцами «мобильный» и «электронная почта» только из строки, которая находится из переменной of QRegExp . Ниже приведен пример кода:

 from PyQt5 import QtCore, QtSql
    
    
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("users.db")
    
if db.open():
    query = QtSql.QSqlQuery()
    query.exec_("""CREATE TABLE IF NOT EXISTS user_name(name TEXT, age TEXT, mobile TEXT, mail TEXT)""")
    
model = QtSql.QSqlTableModel()
model.setTable("table")
model.select()
    
proxy = QtCore.QSortFilterProxyModel()
proxy.setSourceModel(model)
    
query.exec_("INSERT into users VALUES ('name1', 29, 123, 'Mail1.com')")
query.exec_("INSERT into users VALUES ('name2', 30, 456, 'Mail2.com')")
query.exec_("INSERT into users VALUES ('name3', 31, 789, 'Mail3.com')")
    
search_name = "name2"
    
search = QtCore.QRegExp(search_name)
proxy.setFilterRegExp(search)
list_a = []
  

Я хочу распечатать row.index и вставить значение «mobile» и «email» строки list_a .
Как это возможно или есть какое-либо другое решение для запроса?

Комментарии:

1. 1) Пожалуйста, избегайте создания нескольких постов с одним и тем же вопросом, 2) Используйте основные теги, поскольку второстепенным тегам следуют не многие члены сообщества, поэтому немногие (почти никто) могут вам помочь.

2. Я понял, что важность основных тегов очень важна. Спасибо.

Ответ №1:

Нет необходимости создавать модель для фильтрации элементов на основе регулярного выражения, поскольку драйвер Qt sqlite позволяет использовать regex функцию, включающую ее с помощью QSQLITE_ENABLE_REGEXP setConnectOptions() метода using:

 import sys

from PyQt5 import QtSql

db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("users.db")
db.setConnectOptions("QSQLITE_ENABLE_REGEXP=1")

if not db.open():
    sys.exit(-1)

query = QtSql.QSqlQuery()
query.exec_(
    """CREATE TABLE IF NOT EXISTS user_name(name TEXT, age TEXT, mobile TEXT, mail TEXT)"""
)

query.exec_("INSERT into user_name VALUES ('name1', 29, 123, 'Mail1.com')")
query.exec_("INSERT into user_name VALUES ('name2', 30, 456, 'Mail2.com')")
query.exec_("INSERT into user_name VALUES ('name3', 31, 789, 'Mail3.com')")

query_filter = QtSql.QSqlQuery()
query_filter.prepare("SELECT rowid, * FROM user_name WHERE regexp(?, name) ")
query_filter.addBindValue("name1")

if query_filter.exec_():
    record = query_filter.record()
    while query_filter.next():
        print("=======")
        for i in range(record.count()):
            print(record.fieldName(i), query_filter.value(i))
else:
    print(query_filter.lastError().text())
  

Если вы все еще хотите использовать QSqlTableModel, вы также можете использовать метод setFilter:

 import sys

from PyQt5 import QtSql

db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("users.db")
db.setConnectOptions("QSQLITE_ENABLE_REGEXP=1")

if not db.open():
    sys.exit(-1)

query = QtSql.QSqlQuery()
query.exec_(
    """CREATE TABLE IF NOT EXISTS user_name(name TEXT, age TEXT, mobile TEXT, mail TEXT)"""
)

model = QtSql.QSqlTableModel()
model.setTable("user_name")
model.select()

query.exec_("INSERT into user_name VALUES ('name1', 29, 123, 'Mail1.com')")
query.exec_("INSERT into user_name VALUES ('name2', 30, 456, 'Mail2.com')")
query.exec_("INSERT into user_name VALUES ('name3', 31, 789, 'Mail3.com')")

model.setFilter("regexp('%s', name)" % ("name1"))

model.select()
for i in range(model.rowCount()):
    r = model.record(i)
    print("=====")
    for j in range(r.count()):
        print(r.fieldName(j), r.value(j))
  

Если вы все еще хотите использовать QSqlTableModel QSQSortFilterProxyModel, то помимо фильтра вам необходимо отобразить положение строк:

 import sys

from PyQt5 import QtCore, QtSql

db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("users.db")

if not db.open():
    sys.exit(-1)

query = QtSql.QSqlQuery()
query.exec_(
    """CREATE TABLE IF NOT EXISTS user_name(name TEXT, age TEXT, mobile TEXT, mail TEXT)"""
)

model = QtSql.QSqlTableModel()
model.setTable("user_name")
model.select()

proxy = QtCore.QSortFilterProxyModel()
proxy.setSourceModel(model)

query.exec_("INSERT into user_name VALUES ('name1', 29, 123, 'Mail1.com')")
query.exec_("INSERT into user_name VALUES ('name2', 30, 456, 'Mail2.com')")
query.exec_("INSERT into user_name VALUES ('name3', 31, 789, 'Mail3.com')")

model.select()

search_name = "name2"

search = QtCore.QRegExp(search_name)
proxy.setFilterRegExp(search)

for i in range(proxy.rowCount()):
    r = model.record()
    print("=====")
    print("row", proxy.mapToSource(proxy.index(i, 0)).row())
    for j in range(r.count()):
        index = proxy.index(i, j)
        print(r.fieldName(j), index.data())