【问题标题】:How to disable scientific notation in QCompleter?如何在 QCompleter 中禁用科学记数法?
【发布时间】:2018-07-09 19:02:36
【问题描述】:

我有一个表,其中包含一些使用非常大的数字作为主键的记录。我有类似于下面的代码,它使用QCompleter 来自动完成此表中的查找。它可以工作,但显示的完成是使用科学记数法(1234567 => 1.23e6)格式化的。我想按原样显示我的完成。在我看来,我要么需要将查询的响应转换为字符串(不知道如何执行此操作),要么在 QLineEdit 上设置一个属性以禁用科学记数法格式(不知道这个出要么)。有什么想法吗?

class MyDialog(BaseObject, QtGui.QDialog):
     def __init__(self, ... db=None):
         super(MyDialog, self).__init__(parent, logger)
        self.qsql_db = db
        self.init_ui()

    def mk_model(self, completer, pFilterModel, table_name, filter_=None):
        model = QtSql.QSqlTableModel()
        model.setTable(table_name)
        if filter_:
            model.setFilter(filter_)
        model.select()
        pFilterModel.setSourceModel(model)
        completer.setModel(pFilterModel)
        return model

    def setModelColumn(self, completer, pFilterModel, column):
        completer.setCompletionColumn(column)
        pFilterModel.setFilterKeyColumn(column)

    def mk_receipt_id_grid(self):
        font = self.mk_font()
        label_receipt_id = QtGui.QLabel(self)
        label_receipt_id.setText("Order ID")
        label_receipt_id.setFont(font)
        self.text_edit_receipt_id = QtGui.QLineEdit()
        self.text_edit_receipt_id.setFont(font)
        label_receipt_id.setBuddy(self.text_edit_receipt_id)
        self.formGridLayout.addWidget(label_receipt_id, 0, 0)
        self.formGridLayout.addWidget(self.text_edit_receipt_id, 0, 1)
        self.connect(self.text_edit_receipt_id,
                 QtCore.SIGNAL("editingFinished()"),
                 self.get_order_details)

        completer = QtGui.QCompleter(self)
        completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)
        pFilterModel = QtGui.QSortFilterProxyModel(self)
        pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
        completer.setPopup(completer.popup())
        self.text_edit_receipt_id.setCompleter(completer)
        model = self.mk_model(completer, pFilterModel, "orders", "created_at > date_trunc('day', now())")
        self.setModelColumn(completer, pFilterModel, model.fieldIndex("receipt_id"))
        self.text_edit_receipt_id.textEdited.connect(pFilterModel.setFilterFixedString)

问题截图:

【问题讨论】:

    标签: qt pyqt pyqt4 pyside qcompleter


    【解决方案1】:

    一种方法是在完成者的视图上设置一个项目委托。 QStyledItemDelegate 类有一个 dispalyText 可以被覆盖的方法,这使得实现这一点非常容易。

    这是一个简单的演示:

    import sys
    from PySide import QtGui, QtCore
    
    class ItemDelegate(QtGui.QStyledItemDelegate):
        def displayText(self, data, locale):
            if isinstance(data, (int, float)):
                data = '%d' % data
            return super(ItemDelegate, self).displayText(data, locale)
    
    class Window(QtGui.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            edit = QtGui.QLineEdit()
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(edit)
            completer = QtGui.QCompleter(self)
            model = QtGui.QStandardItemModel(self)
            for value in (
                17596767040000.0, 47993723466378568.0,
                1219073478568475.0, 43726487587345.0,
                29928757235623.0, 2245634345639486934.0,
                ):
                item = QtGui.QStandardItem()
                item.setData(value, QtCore.Qt.EditRole)
                model.appendRow([item])
            completer.setModel(model)
            completer.popup().setItemDelegate(ItemDelegate(self))
            edit.setCompleter(completer)
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setGeometry(600, 100, 300, 50)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 嗯,我认为就像将double 转换为real 或?
    • 必须声明一个包含 completer.popup() 的变量。我认为它正在被 GC 处理
    • @Lmwangi。这听起来像一个 pyside 错误 - 你使用的是什么版本? (在 linux 上使用 pyside-1.2.4 对我来说效果很好)。
    • @ekhumoro 我正在使用 PyQt,具体来说,无论在 debian jessie 上发布的是 4.11.2+dfsg-1。感谢您的帮助。
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2011-07-18
    相关资源
    最近更新 更多