【问题标题】:How choose the right column for a comboBox如何为组合框选择正确的列
【发布时间】:2019-03-26 19:57:41
【问题描述】:

我有一个数据库('texpalsac')、Qtdesigner(ventas.ui)、一个表(产品):

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

我希望组合框(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)

【问题讨论】:

    标签: python pyqt pyqt5 qsqltablemodel


    【解决方案1】:

    你必须使用QComboBoxsetModelColumn()方法来指示你要显示的列:

    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
    

    加:

    如果您想显示一个有 2 列的 QComboBox,您必须创建一个自定义 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 中使用它,你必须推广它,为此你可以查看this answer

    【讨论】:

    • 谢谢,它有效。如果我需要显示两列 (COD & NAME) 会怎样?第二列仅作为信息。
    • @JohnnyPalomino 如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour,这是最好的感谢方式。另一方面,我不知道你想如何展示它,我可以想到几种设备,所以为了避免混淆,你可以给我展示你想要获得的图像
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多