LinuxForum.Fans
Тема

Вопросы по Qt (PyQt)

Автор: u-_Serj_- 21 сообщений 4558 просмотров
#262458

Решил я погрызть PyQt4, в связи с чем появилось множество вопросов.
1. Имеется база данных sqlite3, записи в которой состоят из сток юникода и float

text
cur.execute('insert into tovary values(?,?,?,?)',(u'Водонагреватель накопительный SWH RE1 30V',4100.0,'Timberk',u'Китай'))

Пытаюсь вывести данные в таблицу QTableWidget

text

line = 0
for row in cur.execute('select * from tovary'):
    self.ui.tableWidget.setRowCount(line+1)
    for i in range(len(row)):
        item = QtGui.QTableWidgetItem()
        self.ui.tableWidget.setItem(line, i, item)
        item.setText(QtCore.QString(row[i]))
        i += 1
    line += 1

- криво обрабатывает тип float (колонка "Цена")



Если не делать преобразование в QString

text
item.setText(row[i])

, выдаёт ошибку

text

TypeError: QTableWidgetItem.setText(QString): argument 1 has unexpected type 'float'
#262462

sqlite3 через кьют идёт или так?
если так, то попробуй в обычную питоновскую строку сначала сконвертировать...

#262468
"Fat-Zer" написал:
sqlite3 через кьют идёт или так?

Так.

"Fat-Zer" написал:
то попробуй в обычную питоновскую строку сначала сконвертировать...

Пробовал..

text

item.setText(QtCore.QString(str(row[i])))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128)

Делать в БД все поля строковыми, я думаю, не стоит ?

#262471
"-=Serj=-" написал:
text
item.setText(QtCore.QString(str(row[i])))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128)

что тут скажешь... ужасы второго питона... как говорят, use python-3 luke.
ещё, как костыль, можно в QVariant сконвертировать...

#262478

ХА! Выкрутился:

text

if isinstance(row[i], unicode):
    item.setText(QtCore.QString(row[i]))
else:
    item.setText(QtCore.QString(unicode(str(row[i]), 'utf-8')))
#262755

Никак не въеду, как из MainWindow вызывать новые окна (многооконный интерфейс).
Создал класс нового окна:

text

class Ui_addGoods(object):
    def setupUi(self, addGoods):
        .....

В основном файле :

text

class addUnitDialog(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self,parent)
        self.addUnitWidget=Ui_addGoods()
        self.addUnitWidget.setupUi(self)

Запихал в класс основного окна метод:

text

def showaddUnitWindow(self):
        addUnitWindow = addUnitDialog(self)
        addUnitWindow.show()

Окошко появляется, но ущербное и с ошибкой

text

QLayout: Attempting to add QLayout "" to addUnitDialog "addGoods", which already has a layout

Что-то не так с менеджерами компоновки ?
И вообще, правильно ли я делаю ? *PARDON*

#262784
"-=Serj=-" написал:
В основном файле :
text
class addUnitDialog(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self,parent)
        self.addUnitWidget=Ui_addGoods()
        self.addUnitWidget.setupUi(self)

Переделал на

text

class addUnitDialog(QtGui.QWidget):
    ....

Ошибка перестала вылезать, и окно стало по-лучше... Только теперь нет "оконного оформления"...

#262787
text
class addUnitDialog(QtGui.QDialog):
    ....

Так заработало.
Интересно, почему с MainWindow не работало ?

#263041

И все-таки, чей интерфейс лучше использовать для работы с БД (на данный момент SQLite3) Питоний или Qt-ишный, чтобы избежать проблем в дальнейшем ?

#263188

ставлю на Питон

#263285

Мда.. Теперь проблема с кодировкой в обратную сторону. Не получается данные на русском из QLineEdit запихнуть в БД ...

text
print

тоже выводит

text
??????

Как только не извращался. *WALL*

#263288

Причём, в отдельном интерпретаторе, вроде получается

text

>>> from PyQt4 import QtCore
>>> stroka = QtCore.QString("Фигня")
>>> stroka
PyQt4.QtCore.QString(u'\xd0\xa4\xd0\xb8\xd0\xb3\xd0\xbd\xd1\x8f')
>>> print stroka
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
>>> type(stroka)
<class 'PyQt4.QtCore.QString'>
>>> str(stroka)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
>>> print stroka.toAscii()
Фигня
>>> type(stroka.toAscii())
<class 'PyQt4.QtCore.QByteArray'>
>>> print str(stroka.toAscii())
Фигня
>>> type(str(stroka.toAscii()))
<type 'str'>
#263295

-=Serj=-, не... серьёзно... используй третий питон - там на порядок меньше геморроя со строками...

#263297
Fat-Zer написал:
-=Serj=-, не... серьёзно... используй третий питон - там на порядок меньше геморроя со строками...

Да, но как у него дела, например с MySQL ? По-моему, до сих пор под Python3 нет многих полезных модулей....

#263303
"-=Serj=-" написал:
Да, но как у него дела, например с MySQL ? По-моему, до сих пор под Python3 нет многих полезных модулей....

ну да, не всё есть... но ИМХО проще их подправить/портировать/найти альтернативы, чем мучится от геморроя, созданного 10 лет назад...

#263305
"Fat-Zer" написал:
ну да, не всё есть... но ИМХО проще их подправить/портировать/найти альтернативы, чем мучится от геморроя, созданного 10 лет назад...

Ладно, убедил, сдаюсь...

#263357

От ведь! В PyQt4 для Python3 оказывается теперь QString ваще нету... А я уже всю голову сломал - почему не работает...
Уже думал PyQt поломанный.
Вот так можно унифицировать код под обе версии питона:

text

try:
    from PyQt4.QtCore import QString
except ImportError:
    QString = str

Половину хлама из кода пришлось выкинуть !

#263427
"-=Serj=-" написал:
Половину хлама из кода пришлось выкинуть ! 

прям чувствую смертельную обиду... столько ковырялся, мучился, изощрялся, а на третьем питоне всё сразу работает... вот же ж облом =)))

#263458
"Fat-Zer" написал:
прям чувствую смертельную обиду... столько ковырялся, мучился, изощрялся, а на третьем питоне всё сразу работает... вот же ж облом =)))

Ага, аж яд брызжет!

#264199

Что-то я не понял - у QTableWidget разве нет метода, вроде selectedItems (), только для строк ? Т.е. необходимо узнать номера выделенных строк в таблице.
Или придётся использовать свои велосипеды :

text

units = self.ui.tableWidget.selectedItems()
for item in units[::self.ui.tableWidget.columnCount()]:
    print (self.ui.tableWidget.row(item))

или так:

text

units = self.ui.tableWidget.selectedItems()
rows = set()
for item in units:
    rows.add(self.ui.tableWidget.row(item))
print (rows)
Войдите или зарегистрируйтесь, чтобы ответить.