Найти - Пользователи
Полная версия: PyQT4. Привязать маппер к собственному классу, основанному на QComboBox.
Начало » GUI » PyQT4. Привязать маппер к собственному классу, основанному на QComboBox.
1
Pluto
Сделал 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)))
Подскажите, как заставить маппер реагировать на лайнэдит?
py.user.next
pep8. self
Always use self for the first argument to instance methods.
Always use cls for the first argument to class methods.

dip3. __init__
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'
>>>
Pluto
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))
Естественно, чтобы этот код работал, нужно чтобы было создано и someConnection с БД в которой есть someTable
py.user.next
#!/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()

подключение к базе mysql


Pluto
Естественно, чтобы этот код работал
ты его даже не запускал, там много синтаксических ошибок
например, слово class пишется в нижнем регистре

Pluto
mapper = QtGui.QWidgerMapper()
у меня в PyQt4.QtGui есть только QDataWidgetMapper
никакого QWidgerMapper там нет (и QWidgetMapper тоже :) )

Pluto
self.view.setModel(self.view)
это ты где прочитал ?
Rodegast
> никакого QWidgerMapper там нет (и QWidgetMapper тоже )

Скорей всего он имел в виду QDataWidgetMapper
py.user.next
Rodegast
Скорей всего он имел в виду QDataWidgetMapper
в Интернете есть QWidgetMapper (видимо, в PyQt3 был класс такой)
а QDataWidgetMapper с таким аргументом, который он передаёт, выпал с исключением
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