0

私は PyQt4 (バージョン 4.4.4 を使用しています) を学んでおり、Python (Python 2.5) は初めてです。QListWidget と QPushButton を備えた GUI があります。ユーザーがクリックしてリスト内のエントリを選択し、QPushButton をクリックすると、選択したエントリが消えます (QList から削除されます)。私は 1 週間以上この問題に頭を悩ませてきました。助けていただければ幸いです。

現在、GUI が表示され、さまざまなリスト項目を選択できます (現在は一度に 1 つだけです) が、QPushButton をクリックしても何も起こりません。選択色が青から灰色に変わりますが、エントリは削除されません。コマンド プロンプトにエラーは表示されません (Windows 7)。

QPushButton のスロットとして使用している関数 remove() を定義しました。QPushButton.connect は Qt Signal to Python Slot に対して正しく定義されていると思いますが、同様の問題に対する回答で見たものに基づいていますが、アイテムは削除されていません。ただし、削除機能はトリガーされていません。関数内に print ステートメントがありますが、QPushButton をクリックしても呼び出されません。これにより、関数が呼び出されていないことがわかります。

ここに私の最新のコードがあります: (私は meta-SO でコードの大きなブロックについて非常に暴言を吐いた投稿を読んだので、これを関連性があると思われるビットに切り詰めました: リストの作成、ボタンの作成、およびスロットとして使用しようとしている削除機能. 他のセクションが何であるかを示すコメントを残しました.戻します)

class questionGUI(QtGui.QWidget):
#This class is the window of the gui.

    def __init__(self):
        super(questionGUI,self).__init__()
        #Layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        #Labels Needed
        ...

        #Question List
        self.qList = QtGui.QListWidget()
        #print self.qList
        self.qList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
        entries = ['[Pick Image] <Default>','[Slider Question] <Default>', '[Comment Box] <Default>']

        for i in entries:
            item = QtGui.QListWidgetItem(i)
            self.qList.addItem(item)

        #Type select
        ...

        #Text insert Needed
        ...

        #Buttons Needed
        deleteButton = QtGui.QPushButton('Delete Question')
        deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove)

        addQuestionButton = QtGui.QPushButton('Add Question')
        ...

        doneButton = QtGui.QPushButton('Done')
        ...

        #Parameters Needed
        ...

        #Layout Placement and Window dimensions
        ...

    def addQuestion(self):
        ...

    def remove(self):
        print 'remove triggered'
        print self.qList.currentItem()
        self.qList.removeItemWidget(self.qList.currentItem())

...

画像を投稿しようとしましたが、評判が十分ではありません。画像が役立つと思われる場合は、お知らせください。送信できます。

4

1 に答える 1

1

信号を混合しました:

deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove)

deleteButtonは ですが、QPushButton署名が間違っているからの信号のitemClicked(clicked) ように見えます。にはこの信号がないため、接続は行われませんQListWidgetQPushButtonQt は失敗した接続に対してエラーを発生させませんが、.connectメソッドboolには試行された接続の成功/失敗を示す戻り値があります。

また、lambda: self.removeスロットとしては意味がありません。スロットは、シグナルの送信時に呼び出される callable である必要があります。もちろん、lambda関数を作成しますが、メソッドを参照self.removeするだけです。lambda呼び出されますが、呼び出されself.removeません。スロットself.removeで十分です。

clicked()ボタンからの信号(値clicked(bool)が気になる場合はまたは)を使用する必要があります。checked

deleteButton.connect(deleteButton, QtCore.SIGNAL('clicked()'), self.remove)

編集

別の問題: あなたのremoveメソッドは、あなたが望むことをしません。itemremoveItemWidgetを削除するのではなく、アイテムのウィジェットを削除します (設定した場合)。に対応するものです。setItemWidget

takeItemアイテムを削除するために使用する必要があります。

def remove(self):
    self.qList.takeItem(self.qList.currentRow())
于 2013-04-04T00:26:01.680 に答える