Как выбрать правильный столбец для comboBox - PullRequest
0 голосов
/ 22 октября 2018

У меня есть БД ('texpalsac'), Qtdesigner (ventas.ui), таблица (продукты):

 PRODUCTS 
COD   NAME
111   bag
112   shoes
121   pants
122   t-shirts

Мне бы хотелось, чтобы comboBox (comboArt) показывал второй столбец ('NAME)') но я не знаю, как это сделать.На данный момент отображается только первый столбец ('COD': 111,112 ...).Спасибо

class MiFormulario(QDialog, QComboBox):
    def __init__(self, parent=None):
        super(MiFormulario, self).__init__(parent)
        uic.loadUi('Venta.ui', self)

        self.model = QtSql.QSqlTableModel (self)
        self.model.setTable ("products")
        self.model.select ()
        self.comboArt.setModel (self.model)

1 Ответ

0 голосов
/ 22 октября 2018

Вы должны использовать setModelColumn() метод QComboBox, чтобы указать столбец, который вы хотите отобразить:

class MiFormulario(QDialog): # <-- remove QComboBox, it is unnecessary
    def __init__(self, parent=None):
        super(MiFormulario, self).__init__(parent)
        uic.loadUi('Venta.ui', self)

        self.model = QtSql.QSqlTableModel(self)
        self.model.setTable("products")
        self.model.select()
        self.comboArt.setModel(self.model)
        self.comboArt.setModelColumn(1) # <--- select column 1

Плюс:

Если выЧтобы показать QComboBox с 2 столбцами, вы должны создать собственный QComboBox, как показано ниже:

multicombobox.py

from PyQt5 import QtCore, QtGui, QtWidgets


class CustomView(QtWidgets.QTableView):
    def __init__(self, parent=None):
        super(CustomView, self).__init__(parent)
        self.verticalHeader().hide()
        self.horizontalHeader().hide()
        self.setShowGrid(False)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
        self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)

    def adjustWidth(self):
        w = sum([self.horizontalHeader().sectionSize(i) for i in range(self.horizontalHeader().count())])
        self.setFixedWidth(w)
        self.parentWidget().setFixedWidth(w)

    def showEvent(self, e):
        if self.isVisible():
            self.adjustWidth()
        super(CustomView, self).showEvent(e)

class MultiComboBox(QtWidgets.QComboBox):
    def setModel(self, model):
        super(MultiComboBox, self).setModel(model)
        view = CustomView(self)
        self.setView(view)

    def paintEvent(self, e):
        painter = QtWidgets.QStylePainter(self)
        painter.setPen(self.palette().color(QtGui.QPalette.Text))
        opt = QtWidgets.QStyleOptionComboBox()
        self.initStyleOption(opt)
        if self.model():
            p = self.rootModelIndex()
            t = ""
            for c in range(self.model().columnCount(p)):
                t += " " + self.model().index(self.currentIndex(), c).data()
            opt.currentText = t
            fm = QtGui.QFontMetrics(self.font())
            self.setMinimumWidth(fm.width(t))
        painter.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, opt)
        painter.drawControl(QtWidgets.QStyle.CE_ComboBoxLabel, opt)

И если вы хотите использоватьв Qt Designer вы должны продвигать его, для этого вы можете просмотреть этот ответ .

...