2017-10-10 30 views
1

最近、GUIアプリケーションを作成するためにPyQt4を使用し始めました。私はQTableWidgetを使ったアプリケーションを作ろうとしていました。これは、2列目のテーブルで、最初の列がQLineEditに設定され、2列目が代理人を使用してQListWidgetに設定されています(「設定する」が正しい用語でない場合は申し訳ありません)。QListWidget列のエントリは、 QFileDialogPyQt4でのダブルクリック行QTableWidgetはコンテンツを-1に設定します

import sys 
from PyQt4.QtGui import * 
from PyQt4 import uic 
from PyQt4.QtCore import * 

qtCreatorFile = "app_name.ui" # UI File designed using QtDesigner 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class DelegateLEdit(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     line_edit = QLineEdit(parent) 
     return line_edit 

class DelegateLWidget(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     list_widget = QListWidget(parent) 
     list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     return list_widget 

のすべては、私がQListWidget列の任意のセルをダブルクリックするたびに、その特定のセルの内容が、私は "を扱っていない。-1に設定されている。一つのことを除いて正常に動作するようです(私はそれをテキストブラウザー上のセルの内容を印刷させるようにしました)、セルをダブルクリックすると内容が-1になりました。誰もがこれを手伝ってくれますか?QTableWidgetのドキュメントを読んでみましたが、誰も私が行方不明であることを指摘してもらえますか? は、ここに私のFormクラスののinit機能です

def __init__(self): 
    QMainWindow.__init__(self) 
    Ui_MainWindow.__init__(self) 
    self.setupUi(self) 
    self.setWindowFlags(Qt.WindowMinimizeButtonHint) 
    self.list_widget = QListWidget() 
    self.add_button.clicked.connect(self.add_to_list) 
    # self.table.itemDoubleClicked.connect(self.print_cell_content) 

    self.table.setColumnCount(2) 

    first_header = "Option" 
    second_header = "Directories" 

    header = first_header + ";" + second_header 
    self.table.setHorizontalHeaderLabels(header.split(";")) 
    header = self.table.horizontalHeader() 

    header.setResizeMode(1, QHeaderView.ResizeToContents) 

    self.table.resizeColumnsToContents() 
    # self.table.setShowGrid(False) 

    self.delegate_lw = DelegateLWidget(self) 
    self.delegate_le = DelegateLEdit(self) 

    self.table.setItemDelegateForColumn(0, self.delegate_le) 
    self.table.setItemDelegateForColumn(1, self.delegate_lw) 

EDIT:テーブルの2番目の列にファイルを追加し、追加ボタン用 ハンドラ

def add_to_list(self): 

    file_dialog = QFileDialog(self) 
    file_dialog.saveState() 
    file_dialog.setOption(QFileDialog.DontUseNativeDialog, True) 


    file_list = file_dialog.getOpenFileNames() 
    self.dir_list.extend(file_list) 
    self.dir_list = list(set(self.dir_list)) 
    self.add_items(self.dir_list) 

def add_items(self, list_items): 
    list_items.sort() 
    column = 1 
    self.row_count = 0 
    for item in list_items: 
     self.table.insertRow(self.row_count) 
     self.table.setItem(self.row_count, column, QTableWidgetItem(item)) 
     self.row_count += 1 

+0

編集時に。あなたが本当に欲しいのはそれですか?または、実際に表示されるアイテムウィジェットを実際に設定したいのですか?セルをダブルクリックすると、何が起こると思いますか? – eyllanesc

+0

に項目を追加する方法を示すことができ – ekhumoro

+0

@ekhumoroええ、私は実際に編集時にウィジェットを表示したい。問題は、リストウィジェットのitem-delegateを使用している2番目のカラムにあります。その列のセルをダブルクリックすると、そのセルの値が-1にリセットされます。私はそれを避けることを望んでいます – 0Nicholas

答えて

1

あなたが必要ありがとうございましたモデルのデータを格納して取得できるように、setEditorDatasetModelDataをデリゲートに実装します。リストウィジェット列の場合、デフォルトの動作では現在のインデックスが表示され、空のリストの場合は-1になります。ここで

は、デリゲートクラスがどのように見えるかです:

class DelegateLEdit(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     line_edit = QLineEdit(parent) 
     return line_edit 

    def setEditorData(self, editor, index): 
     editor.setText(index.data()) 

    def setModelData(self, editor, model, index): 
     model.setData(index, editor.text()) 

class DelegateLWidget(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     list_widget = QListWidget(parent) 
     list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     list_widget.addItems('One Two Three Four'.split()) # or whatever 
     return list_widget 

    def setEditorData(self, editor, index): 
     for line in index.data().splitlines(): 
      for item in editor.findItems(line, Qt.MatchExactly): 
       item.setSelected(True) 

    def setModelData(self, editor, model, index): 
     text = '\n'.join(item.text() for item in editor.selectedItems()) 
     model.setData(index, text) 
あなたがのみ表示され、カスタムエディタを提供するために、アイテムのデリゲートを使用しているように見えるテーブル
+0

ありがとうございました。これは私の問題の大きな部分を解決しました。私は自分の必要性に合わせてコードを少し修正しましたが、今は別の問題に直面しています。 list_widgetの項目をダブルクリックすると、それが消えて、他の項目をクリックすると戻ってきます。それは起こるはずですか? フォームクラス で行われたように 'list_widget.addItems()'が削除され、行が 'line = index.data()'に変更されました。いずれの場合も、editor.findItems()はlen 0 – 0Nicholas

+0

@ 0Nicholasのリストを返します。 'addItems'を削除した場合、どのようにリストに値を設定していますか?リストから** one **アイテムだけを選択したいですか?もしそうなら、コンボボックスはエディタウィジェットのもっと良い選択となるでしょう。 – ekhumoro

+0

'add_to_list()'メソッドに接続されたQPushButtonを追加しました。私は質問を編集し、同じコードを追加しました。それはリストウィジェットを作成する悪い方法ですか? – 0Nicholas

関連する問題