2017-09-23 1 views
0

私はExcelのようなセルを持つテーブルを持っています。私は自分のビューを更新するために私のモデルからdataChanged信号を出す必要があることを知っています、それは完全に動作します。しかし、アップデートが別の(Python)スレッドから来た場合、新しい値が表示されるように、更新されたセルでマウスをクリック(一度クリック)する必要があります。私はアップデートがすでにアクティブであるセルに関連する場合、更新がすぐに反映されているすぐにdatachangedのビューを更新

...(私は、ログを見ることができる)、新たな値が正しくモデルに設定ですけど、表示が遅れています。

右のセルをクリックせずにViewを強制的に更新するには、どのような信号を出すべきですか?

EDITこれで動作します。私は単純なpythhonスレッドではなくQThreadを実装し、シグナルをデータモデルからハンドラに接続する必要があります。解決済み

答えて

0

警告QObject::connect: Cannot queue arguments of type 'QVector<int>'は、dataChangedシグナルがキャプチャされないようにしていました。これは、この信号が別の(pythonic)スレッドから放出されたために起こりました。それを動作させるためには、私のようなQTheadをサブクラス化するために必要な:

class MyThread(QThread): 
    updated = QtCore.pyqtSignal(str) 

    def run(self): 
     while 1: 
      result= do stuff... 
      self.updated.emit(result) 

そして、私のQAbstractTableModelで、私のモデルに信号を接続します

class TableModel(QAbstractTableModel): 
    def __init__(self, rowCount: int, colCount: int, parent=None): 
     super(QAbstractTableModel, self).__init__(parent) 
     self._listenerth = MyThread() 
     self._listenerth.updated.connect(self.remote_update_handler) 
     self._listenerth.start(QThread.LowPriority) 

    def remote_update_handler(self,result): 
     self.setData(QModelIndex,result, QtCore.Qt.EditRole) 

これは警告がなくなって作られた、および更新が完璧に働きました