Форум сайта python.su
Сделал sf.value в классе MyCombo вот таким.
sf.value = QtGui.QLineEdit()
Теперь его можно привязать к мапперу типа так:
Создать комбобокс из моего класса:
combo = MyCombo(someConnection, “someTable”, “fieldForSearch”, “fieldForResult”)
Затем организовать маппер так:
mapper = QtGui.QWidgerMapper()
mapper.setModel(someModel)
mapper.addMapping(combo.value, someModel.fieldIndex(“someField”))
Теперь маппер реагирует на данные в MyCombo.value
Но, проблема: реагирует он только после того, как пользователь что-нибудь выберет в комбобоксе. Если пользователь ничего не выбирал (не кликал мышкой, не крутил колёсиком, сменяя пункты), то маппер никак не отреагирует, и то значение, которое появляется в комбобоксе по-умолчанию при его появлении не будет маппером записано в таблицу БД.
Короче, маппер среагирует только при щелчке/выборе значения в комбобоксе пользователем.
Но ведь я же связал, вроде бы, маппер не с комбобоксом, а с lineEdit'ом, который стал частью комбобокса. Почему он реагирует на события комбобокса, а не lineEdit'а?
Я пытался напрямую в __init__ вызвать процедуру OnSelect() - ноль эмоций у маппера.
Class MyCombo(QtGui.QComboBox) def __init__(sf, connection, table, field_for_search, field_for_result) QtGui.QComboBox.__init__() #sf.value = None sf.value = QtGui.QLineEdit() sf.view = QtGui.QTableView() sf.model = QtSqlTableModel(None, connection) sf.model.setTable(table) sf.model.select() sf.view.setModel(sf.view) sf.setModel(sf.model) sf.setModelColumn(sf.model.fieldIndex(field_for_search)) sf.setView(sf.view) sf.activated.connect(sf.onSelect) def onSelect(sf): sf.value.setText(sf.model.record(sf.currentIndex().value(sf.field_for_result)))
Отредактировано Pluto (Март 15, 2014 17:06:22)
Офлайн
Always use self for the first argument to instance methods.
Always use cls for the first argument to class methods.
By convention, this argument is named self. This argument fills the role of the reserved word this in C++ or Java, but self is not a reserved word in Python, merely a naming convention. Nonetheless, please don’t call it anything but self; this is a very strong convention.
>>> import PyQt4.QtGui >>> >>> PyQt4.QtGui.QWidgetMapper Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute 'QWidgetMapper' >>>
Отредактировано py.user.next (Март 15, 2014 19:08:53)
Офлайн
import PyQt4.QtGui
from PyQt4 import QtGui
Always use self
Не могу заставить себя набирать все четыре буквы. Честное слово - в ЛОМ.
Я не пишу программы в команде, и очень вряд ли, что когда-нибудь буду.
Так что в своих программках буду писать как хочу.
Но для вас, если вы настаиваете, на страницах этого форума исправлю:
from PyQt4 import QtGui Class MyCombo(QtGui.QComboBox) def __init__(self, connection, table, field_for_search, field_for_result) QtGui.QComboBox.__init__() self.value = QtGui.QLineEdit() self.view = QtGui.QTableView() self.model = QtSqlTableModel(None, connection) self.model.setTable(table) self.model.select() self.view.setModel(self.view) self.setModel(self.model) self.setModelColumn(self.model.fieldIndex(field_for_search)) self.setView(self.view) self.activated.connect(self.onSelect) def onSelect(self): self.value.setText(self.model.record(self.currentIndex().value(self.field_for_result))) combo = MyCombo(someConnection, “someTable”, “fieldForSearch”, “fieldForResult”) mapper = QtGui.QWidgerMapper() mapper.setModel(someModel) mapper.addMapping(combo.value, someModel.fieldIndex(“someField”))
Отредактировано Pluto (Март 16, 2014 09:37:32)
Офлайн
#!/usr/bin/env python3 from PyQt4 import QtGui, QtSql import sys class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.text = QtGui.QTextEdit(self) self.db = self.open_mysql_database('localhost', 'test') self.test_mysql_query() self.setGeometry(500, 500, 250, 150) self.setWindowTitle('Example') self.show() def open_mysql_database(self, host, database): db = QtSql.QSqlDatabase('QMYSQL') db.setHostName(host) db.setDatabaseName(database) if not db.open(): raise ValueError('Can\'t open database') return db def test_mysql_query(self): query = QtSql.QSqlQuery(self.db) query.exec('SELECT number, message FROM t') s = '' while query.next(): number = query.value(0) message = query.value(1) s += '{}|{}\n'.format(number, message) self.text.setText(s) def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
Plutoты его даже не запускал, там много синтаксических ошибок
Естественно, чтобы этот код работал
Plutoу меня в PyQt4.QtGui есть только QDataWidgetMappermapper = QtGui.QWidgerMapper()
Plutoэто ты где прочитал ?self.view.setModel(self.view)
Отредактировано py.user.next (Март 17, 2014 04:07:53)
Офлайн
> никакого QWidgerMapper там нет (и QWidgetMapper тоже )
Скорей всего он имел в виду QDataWidgetMapper
Офлайн
Rodegastв Интернете есть QWidgetMapper (видимо, в PyQt3 был класс такой)
Скорей всего он имел в виду QDataWidgetMapper
Офлайн