Найти - Пользователи
Полная версия: QSqlQueryModel проблема с кодировкой видимо
Начало » GUI » QSqlQueryModel проблема с кодировкой видимо
1
hellslade
Всем привет.
# http://www.prog.org.ru/topic_4344_0.html
# http://www.prog.org.ru/topic_4202_0.html
from PyQt4 import QtSql, QtGui,QtCore
import sys

views = []
def initializeModel(model):
model.setQuery("select user.user from user")
model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant(QtCore.QObject.tr(model, "user")))

def createView(title, model):
view = QtGui.QTableView()
views.append(view)
view.setModel(model)
view.setWindowTitle(title)
view.show()
def createConnection():
db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
db.setHostName('localhost')
db.setDatabaseName("mysql")
db.setUserName("root")
db.setPassword("****")

if not db.open():
QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
QtGui.qApp.tr("Unable to establish a database connection.\nClick Cancel to exit."),
QtGui.QMessageBox.Cancel)
return False
query = QtSql.QSqlQuery()
# query.exec_('SET NAMES utf8_general_ci;')
query.exec_("""SET NAMES 'cp1251'""")
return True

class CustomSqlModel(QtSql.QSqlQueryModel):
def data(self, index, role):
value = QtSql.QSqlQueryModel.data(self, index, role)
if value.isValid() != True:
pass
else:
print "value ok"
return value
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)

codec = QtCore.QTextCodec.codecForName("cp1251");
QtCore.QTextCodec.setCodecForLocale (codec)
QtCore.QTextCodec.setCodecForCStrings (codec)
QtCore.QTextCodec.setCodecForTr (codec)
defcodec = QtCore.QTextCodec.codecForLocale()
print defcodec.name()


if not createConnection():
sys.exit(1)

CustomModel = CustomSqlModel()

initializeModel(CustomModel)

createView(QtCore.QObject.tr(CustomModel, "Custom Query Model"), CustomModel)

app.setQuitOnLastWindowClosed(True)
sys.exit(app.exec_())
По задумке, должны быть выведены имена пользователей из базы mysql, но..показывается таблица, количество строк == 7, что соответствует количеству записей в таблице, но строки пустые.
Ошибок не пишет (разве что при выключении соединение не закрывается). Пробовал разные кодировки – результат один: ошибок нет, данных нет.
Как я понимаю, данные есть, но модель не понимает кодировку, поэтому строки и не показывает? Верху кода 2 ссылки – то, что читал.
Есть какие-то пути решения, кроме как пересобрать плугин mysql для qt?

В mysql дефолтная кодировка cp1251 в таблицах такая же
VikingKong
UP. Столкнулся с той же проблемой: QTableView показывает таблицу с числом строк, соответствующим реальным данным, но все ячейки пустые. Сильно сомневаюсь, что дело в кодировке, поскольку не отображаются вообще никакие символы (даже цифры). При этом запросы посредством QSqlQuery (пробовал создавать таблицы и вставлять в них данные) отрабатывают корректно: таблицы создаются и данные в них появляются, проверял на сервере средствами самого мускула. Мистика какая-то.
apologize828
Припоминаю что как-то тоже столкнулся с похожей штукой(И да даже ID не был виден). Фишка была в том что надо данные преобразовать к типу:
ну например типа toString() или пришлось оборачивать в str():
короче допустим что-то типа этого:
     while (query.next()) {
QString name = query.value(0).toString();
int salary = query.value(1).toInt();
qDebug() << name << salary;
}
Взято из доков!короче посмотри что там у тебя с типами перед тем как выводишь, хотя может и не то)))
dartNNN
apologize828
надо данные  преобразовать к типу
Все это конечно верно, но только в том случае, если данные берутся из таблицы “вручную” с помощью query. А тут у нас люди работают с моделью, которая сама отрабатывает все данные (посмотрите пример querymodel.py там никакого приведения типов нет:)). Могу посоветовать ТС попробовать через query данные выудить, но без особой надежды, т.к. по всему видно, что ошибка где-то в недрах Qt (код достаточно короткий ошибок нет, почти вся работа выполняется классами самого Qt). Еще мона попробовать пример querymodel.py запустить только подключение к своей базе сделать, если не заработает, то переустанавливать/пересобирать и танцевать с бубном.
apologize828
dartNNN
Все это конечно верно, но только в том случае, если данные берутся из таблицы “вручную” с помощью query. А тут у нас люди работают с моделью, которая сама отрабатывает все данные (посмотрите пример querymodel.py там никакого приведения типов нет:)).
Точно точно,что то я поспешил)! Я вспомнил, я тогда еще с QTableWidget работал)))
P.S. Ну я же говорил, что может не то)))Ну тогда точно бубин в руки)))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB