4

私はPyQtを使用して、JSON形式の文字列を含むログファイルから読み取り、それらをテーブルに適切に出力する単純なアプリケーションを使用しています。

'load'関数からシグナルを出力しようとする場合を除いて、すべてが期待どおりに機能しています。この信号は、新しい情報でテーブルを再利用するように設計されたスロットで、メインウィンドウによって取得されます。

信号が発信されない場合、テーブルは完全かつ適切に入力されます。

通常のビュー、信号なし

self.emit信号が発信されるようにコメントを解除すると、テーブルは不完全になります。

信号が放出され、空白のセル

最初の画像でわかるように、テーブルは並べ替えられていませんが、すべてのフィールドにデータが入力されています。2番目の画像では、テーブルが並べ替えられていますが、一部のフィールドが空白になっています。

テーブルにデータを入力してシグナルを送信するコード:

#openLog function does stuff, then populates the table as follows

self.ui.tableWidget.setRowCount(len(entries))
self.ui.tableWidget.verticalHeader().setVisible(False)

for i, row in enumerate(entries):
    for j, col in enumerate(row):
        item = QtGui.QTableWidgetItem(col)
        self.ui.tableWidget.setItem(i, j, item)

#When this is uncommented, the table ends up having a lot of blank cells.
#self.emit(QtCore.SIGNAL("updateSignal"))

信号を受信し、動作するためのコード:

#main window class
    #__init__
        self.ui.tableWidget.connect(self,QtCore.SIGNAL("updateSignal"),self.updateTable)

    def updateTable(self):
        self.ui.tableWidget.sortItems(0,QtCore.Qt.DescendingOrder)

プログラムフローは、program_init->register_signalと呼ばれます。ログを開くためのユーザーアクション->テーブルにデータを入力するopenLog関数/シグナルを送信->シグナルを受信/リゾートテーブル

この方法では、シグナルとスロットを使用しています。使用していないかのように、QT / Pythonは、関数からGUI/Pixmapを再描画するのが安全ではないという警告を大量にスローします。

質問: テーブルが完全に入力されていることを確認しながら、QTableWidgetを目的の列で並べ替えるにはどうすればよいですか?

4

2 に答える 2

9

QTableWidget.setSortingEnabled(False)解決策は、を呼び出してテーブルにデータを入力しているときに並べ替えを無効にしてから、並べ替えを復元することだと思います。

コード例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QWidget):
    updateSignal = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.table_widget = QtGui.QTableWidget()
        self.button = QtGui.QPushButton('Populate')
        self.button.clicked.connect(self.populate)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.table_widget)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.updateSignal.connect(self.update_table)
        self.populate()

    def populate(self):
        nrows, ncols = 5, 2
        self.table_widget.setSortingEnabled(False)
        self.table_widget.setRowCount(nrows)
        self.table_widget.setColumnCount(ncols)
        for i in range(nrows):
            for j in range(ncols):
                item = QtGui.QTableWidgetItem('%s%s' % (i, j))
                self.table_widget.setItem(i, j, item)
        self.updateSignal.emit()
        self.table_widget.setSortingEnabled(True)

    def update_table(self):
        self.table_widget.sortItems(0,QtCore.Qt.DescendingOrder)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    wnd = MainWindow()
    wnd.resize(640, 480)
    wnd.show()
    sys.exit(app.exec_())
于 2012-03-21T15:08:27.763 に答える
0

私は似たようなことに取り組んできましたが、並べ替えを設定していませんでした。私は両方の方法を試しましたが、どちらもうまくいきました。

私のリストは辞書のリストなので、あなたのものとは少し異なります。

テーブル ウィジェットを含む tabledialog クラスを作成しました。この関数はメイン ウィンドウから呼び出されます。

def setuptable(self, alist):

    # setup variables
    rows = len(alist)
    cols = len(alist[0])
    keys = ['number', 'name', 'phone', 'address'] # for dictonary order

    # setup cols, rows
    self.tableWidget.setRowCount(rows)
    self.tableWidget.setColumnCount(cols)

    # insert data
    for row in range(rows):
        for col in range(cols):
            item = QtGui.QTableWidgetItem()
            item.setText(alist[row][keys[col]] or '') # or '' for any None values
            table.setItem(row, col, item)

    keys = [item.title() for item in keys]  # capitalize
    self.tableWidget.setHorizontalHeaderLabels(keys) # add header names
    self.tableWidget.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignLeft) # set alignment
    self.tableWidget.resizeColumnsToContents() # call this after all items have been inserted

    self.tableWidget.sortItems(1,QtCore.Qt.AscendingOrder)

また、tablesetup関数の最後で使用してみました:

self.emit(QtCore.SIGNAL("loadingDone"))

メイン ウィンドウの init セクションでスロットをセットアップします。

# setup the dialog
import dialogtable
self.tabledialog = dialogtable.dialogtable()

# signal from table dialog
self.tabledialog.connect(self.tabledialog,QtCore.SIGNAL("loadingDone"),self.tableSort)

そして呼び出された関数:

def tableSort(self):
    self.tabledialog.tableWidget.sortItems(1,QtCore.Qt.AscendingOrder)

私のテーブルウィジェットのセットアップ機能:

    # set table widget attributes
    self.tableWidget.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked) # use NoEditTriggers to disable editing
    self.tableWidget.setAlternatingRowColors(True)
    self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
    self.tableWidget.verticalHeader().setDefaultSectionSize(18) # tighten up the row size
    self.tableWidget.horizontalHeader().setStretchLastSection(True) # stretch last column to edge
    self.tableWidget.setSortingEnabled(True) # allow sorting

上記の回答が推奨しているように、ソートを false に設定することはありません。

于 2012-03-21T16:13:06.430 に答える