Форум сайта python.su
Здравствуйте, возможно пишу не в ту ветку, т.к мой вопрос относится и к GUI и к базам данных и вдобавок я новичок, потому и решил написать в раздел для новичков. Подскажите пожалуйста как заполнить ComboBox данными из SQL запроса используя PyQT. По заполнению простым списком значений примеров много, а вот как запросом не пойму. И сразу если можно, как связать два комбобокса, что бы данные во втором изменялись на основании первого. С SQL проблем нет, а вот с Python и PyQT пока большие. Если можно небольшой пример или ссылку.
Заранее спасибо.
Офлайн
По первому вопросу:
Ну тут, как я понимаю особых хитростей нет. Просто преобразовать данные из запроса в список значений, а дальше по известным примерам. Что используете для работы с базой? (только не говорите что QtSql:)).
По второму вопросу:
Хотелось бы знать что именно вам нужно, но пока потелепатирую:)
В QComboBox есть сигнал currentIndexChanged(int), вот его значит подсоединяем к слоту (функции), которая обработает эту смену так, как вам это нужно.
Офлайн
Bujhm666Если использовать Qtsql то я замутил вот так может тупо и коряво зато пашет))):
Здравствуйте, возможно пишу не в ту ветку, т.к мой вопрос относится и к GUI и к базам данных и вдобавок я новичок, потому и решил написать в раздел для новичков. Подскажите пожалуйста как заполнить ComboBox данными из SQL запроса используя PyQT. По заполнению простым списком значений примеров много, а вот как запросом не пойму. И сразу если можно, как связать два комбобокса, что бы данные во втором изменялись на основании первого. С SQL проблем нет, а вот с Python и PyQT пока большие. Если можно небольшой пример или ссылку.
Заранее спасибо.
query2=QtSql.QSqlQuery()
query2.exec("SELECT * FROM avto")
while query2.next():
#тут короче добавляю значения которые ты хочешь добавить в комбобокс в моем случае получается все значения из первого столбца таблицы авто
self.my_mainwindow.combobox_avto.addItem(str(query2.value(1)))
А вообще посмотри sqlite там это проще и понятнее:
http://www.intuit.ru/department/pl/python/10/python_10.htm
P.S. dartNN посмотри плиз мой вопрос по старой ссылке нашего обсуждения тоже по combobox
ссылка:
http://www.python.su/forum/viewtopic.php?id=6734
Отредактировано (Март 23, 2010 22:38:38)
Офлайн
Вот простенький пример, форма с одним комбобоксом, который заполняется из SQLite.
Строки в комбик добавляются согласно количеству записей таблицы, но вместо нормального текста в них отображается - <PyQt4.QtCore.QVariant object at 0xb77021dc>.
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui, QtSql
import connection
class ComboTest(QtGui.QWidget):
def __init__(self,*args):
QtGui.QWidget.__init__(self,*args)
boxlay = QtGui.QHBoxLayout(self)
frame = QtGui.QFrame(self) # Фрейм
frame.setFrameShape(QtGui.QFrame.StyledPanel)
frame.setFrameShadow(QtGui.QFrame.Raised)
gridlay = QtGui.QGridLayout(frame) # Менеджер размещения элементов во фрейме
label1 = QtGui.QLabel(u"Offices:",frame) # Текстовая метка.
gridlay.addWidget(label1,0,0)
combo1 = QtGui.QComboBox(frame) # Поле ввода с раскрывающимся списком.
combo1.setEditable(True)
gridlay.addWidget(combo1,0,1)
boxlay.addWidget(frame)
query1=QtSql.QSqlQuery()
query1.exec_("select id, location from offices")
while query1.next():
combo1.addItem(str(query1.value(1)))
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
if not connection.createConnection():
sys.exit(1)
ct = ComboTest()
ct.show()
sys.exit(app.exec_())
#!/bin/env python
from PyQt4 import QtSql, QtGui
def createConnection():
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(":memory:")
if not db.open():
QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
QtGui.qApp.tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information "
"how to build it.\n\n"
"Click Cancel to exit."),
QtGui.QMessageBox.Cancel)
return False
query = QtSql.QSqlQuery()
query.exec_("create table person(id int primary key, idoffices int,"
"firstname varchar(20), lastname varchar(20))")
query.exec_("insert into person values(101, 0, 'Danny', 'Young')")
query.exec_("insert into person values(102, 0, 'Christine', 'Holand')")
query.exec_("insert into person values(103, 1, 'Lars', 'Gordon')")
query.exec_("insert into person values(104, 2, 'Roberto', 'Robitaille')")
query.exec_("insert into person values(105, 2, 'Maria', 'Papadopoulos')")
query.exec_("select id, location from offices")
query.next()
print query.value(1)
createConnection()
Отредактировано (Март 24, 2010 07:38:46)
Офлайн
Ну тут важно понимать одну вещь: PyQt это привязка Qt к питону, поэтому оно выходит как нечто среднее между C и Python. А именно, в PyQt свои типы данных, с относительно четкой типизацией (по сравнению с питоном). Что мы имеем в данном случае: PyQt4.QtCore.QVariant - это тип Variant, и он (вот наглец) сам в строку не преобразуется! Поэтому надо писать
query.value(1).toString()
Офлайн
Огромное спасибо, заработало. И ведь я смотрел на этот toString, только так и не понял, куда его приспособить.
Офлайн
Помогите, пожалуйста, написать код для combobox если список взят их базы данных,ведь я -она.
Офлайн
oshkeraИнформация к размышлению
Помогите, пожалуйста, написать код для combobox если список взят их базы данных,ведь я -она.
Офлайн
Всем привет,
поделитесь работающим примером!
Спасибо.
Офлайн
dartNNNУ меня на питоне 2.5.4 такой код не обрабатывает символы кирилицы. Выходит сообщение об ошибке
Ну тут важно понимать одну вещь: PyQt это привязка Qt к питону, поэтому оно выходит как нечто среднее между C и Python. А именно, в PyQt свои типы данных, с относительно четкой типизацией (по сравнению с питоном). Что мы имеем в данном случае: PyQt4.QtCore.QVariant - это тип Variant, и он (вот наглец) сам в строку не преобразуется! Поэтому надо писать
Код:
query.value(1).toString()
Traceback (most recent call last):
File "c:\Python25\example\qt\zapchast\main.py", line 94, in add_zapis
self.refresh()
File "c:\Python25\example\qt\zapchast\main.py", line 69, in refresh
item1=QtGui.QTableWidgetItem(str(query.value(1).toString()))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
Отредактировано (Ноя. 18, 2010 06:59:35)
Офлайн