Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2013 19:58:42

widg
Зарегистрирован: 2013-05-06
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt QTableView QAbstractTableModel

Доброе время суток!
Помогите пожалуйста.
Пытаюсь из базы данных MySQL вывести простую табличку, но выводить ошибку:

Traceback (most recent call last):
File “C:\Users\admin\Desktop\py\table.py”, line 93, in data
return QVariant(QString(decode_r))
TypeError: string indices must be integers

Вот код:

# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='Qwe12345', db='tablo', charset='utf8')
cur = conn.cursor()
cur.execute("SELECT nk,floor,nomination,name FROM tablo")
for roww in cur:
    r = roww
    str_r = str(r)
    decode_r = str_r.decode('unicode_escape')
def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        # create table
        table = self.createTable()
        # layout
        layout = QVBoxLayout()
        layout.addWidget(table)
        self.setLayout(layout)
        # set font
        font = QFont("Courier New", 16)
        
    def createTable(self):
        # create the view
        tv = QTableView()
        # set the table model
        tm = MyTableModel(self)
        tv.setModel(tm)
        # set the minimum size
        tv.setMinimumSize(400, 300)
        # hide gridnt()
        #tv.setShowGrid(False)
        # set the font
        font = QFont("Courier New", 8)
        tv.setFont(font)
        # hide vertical header
        vh = tv.verticalHeader()
        vh.setVisible(False)
        #tv.sizeHintForRow(101)
        # set horizontal header properties
        hh = tv.horizontalHeader()
        hh.setStretchLastSection(True)
        # set column width to fit contents
        #tv.resizeColumnsToContents()
        # set row height
        #nrows = tm.rowCount(self)
        #for row in xrange(nrows):
            #tv.setRowHeight(row, 15)
        return tv
class MyTableModel(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
    def rowCount(self, parent):
        #кол-во строк
        return conn.affected_rows()
    def columnCount(self, parent):
        #кол-во колонок
        return 4
    def data(self, index, role):
        ##тут фунция вытягивания данных
        if not index.isValid():
            return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()
        ## для отладки-можно видеть обращения к функции
        #print QString(u"клетка ")+str(index.row())+"-"+str(index.column())
        return QVariant(QString(decode_r[index.row(),index.column()]))
        
    def headerData(self, col, orientation, role):
        ## тут задаются заголовки
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return QVariant(QString(u"Колонка ")+str(col))
        return QVariant()
if __name__ == "__main__":
    main()

Офлайн

#2 Май 12, 2013 21:20:18

widg
Зарегистрирован: 2013-05-06
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt QTableView QAbstractTableModel

вот что показывает нам запрос из базы:
>>>
(u'111', u'1', u'Врач', u'Иванов Иван Иванович')
(u'222', u'2', u'Врач', u'Петров Иван Игорович')

код:

# -*- coding: utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='Qwe12345', db='tablo', charset='utf8')
cur = conn.cursor()
cur.execute("SELECT nk,floor,nomination,name FROM tablo") #nk,floor,nomination,name
for roww in cur:
    r = roww
    str_r = str(r)
    decode_r = str_r.decode('unicode_escape')
    print decode_r

Офлайн

#3 Май 12, 2013 22:23:45

widg
Зарегистрирован: 2013-05-06
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt QTableView QAbstractTableModel

проблема тут:

for roww in cur:
    r = roww
    str_r = str(r)
    decode_r = str_r.decode('unicode_escape')

вот тут мы делаем их строковыми:
str_r = str(r)

и индексы получаются строковыми, если не делать строковыми а возвращать roww то будет ругаться на кортеж:

tuple indices must be integers, not tuple

Офлайн

#4 Май 13, 2013 06:53:40

widg
Зарегистрирован: 2013-05-06
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt QTableView QAbstractTableModel

всё разобрался

return QVariant(QString(decode_r[index.row(),index.column()]))

надо писать

return QVariant(QString(decode_r[index.row()][index.column()]))

и тут изменил на

decode_r = []
for roww in cur:
    decode_r.append(roww)

с этим этапом разобрался, теперь буду редактор таблицы писать

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version