qt - 如何在 QCompleter 中禁用科学记数法?

标签 qt pyqt pyqt4 pyside qcompleter

我有一个表,其中包含一些使用非常大的数字作为主键的键控记录。我有类似于下面的代码,它使用 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)

问题截图:Screenshot of the issue:

最佳答案

实现此目的的一种方法是在完成者的 View 上设置一个项目委托(delegate)。 QStyledItemDelegate 类有一个可以重写的 displayText 方法,这使得实现起来非常容易。

这是一个简单的演示:

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_())

关于qt - 如何在 QCompleter 中禁用科学记数法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529127/

相关文章:

c++ - QT将参数传递给QDialog要求

python - 为什么我需要 "sys.argv"才能在 PyQt 中启动 QApplication?

python - 如何在 PyQt 中创建操纵杆/ Controller 小部件?

python - 将 dialog.ui 转换为 dialog.py 与 QGIS 的冲突

qt - 当我尝试在 Visual Studio 11 Express Beta 中从源代码构建 Qt 时,为什么会收到此错误?

c++ - QTableView 导出到 .csv 获取的行数仅限于 256

c++ - QSslSocket 错误

python - PyQt5 OpenGL Cubemap - 黑色窗口显示

qt - 如何在 QGraphicsPolygonItem 中添加 QInputDialog.getText 文本?

python - 如何在Python中使用字典代替if语句?