2

チェックボックスのチェックを外すと関数disable_modが呼び出され、チェックするとenable_modが呼び出されるシステムをPyQt4に実装しようとしています。しかし、状態が変化していても、チェックボックスは最初の関数を呼び出します。この場合、すでにチェックされているボックスをクリックすると、常に disable_mod 関数が呼び出されます。なぜこれが起こっているのか理解できませんか?ここで少し手伝ってくれませんか?これが私のコードです:

from PyQt4 import QtCore, QtGui
from os import walk
from os.path import join
import sys

def list_files_regex(dir):
    l = []
    for (root, dirnames, filenames) in walk(dir):
        for d in dirnames:
            list_files_regex(join(root, d))
        l.extend(filenames)
    return l

directory = "J:/test_pack"
directory = join(directory, "/mods")

count = 0
for y in list_files_regex(directory):
    print y
    count += 1
print count

class ModEdit(QtGui.QMainWindow):
    def __init__(self, title, icon, x, y, w, h):
        super(ModEdit, self).__init__()
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(icon))
        self.setGeometry(x, y, w, h)
        self.choices = []
        self.init()

    def init(self):
        scroll_widget = QtGui.QScrollArea()
        sub_widget = QtGui.QWidget()
        v_layout = QtGui.QVBoxLayout()

        for y in list_files_regex(directory):
            tmp = QtGui.QCheckBox(y, self)
            tmp.resize(tmp.sizeHint())
            if tmp.text()[len(tmp.text()) - 8: len(tmp.text())] != 'disabled':
                tmp.setChecked(True)
            # if tmp.isChecked() == 0:
            #     tmp.stateChanged.connect(self.enable_mod)
            # if tmp.isChecked():
            #     tmp.stateChanged.connect(self.disable_mod)
            # v_layout.addWidget(tmp)
            self.choices.append(tmp)
        print self.choices
        for choice in self.choices:
            v_layout.addWidget(choice)
            if choice.isChecked():
                choice.stateChanged.connect(self.disable_mod)
            else:
                choice.stateChanged.connect(self.enable_mod)
        sub_widget.setLayout(v_layout)
        scroll_widget.setWidget(sub_widget)
        self.setCentralWidget(scroll_widget)
        self.show()

    def enable_mod(self):
        print "ENABLE_TEST"
        print self.choices[1].isChecked()
    def disable_mod(self):
        print "DISABLE_TEST"
        print self.choices[1].isChecked()

    def test(self):
        print 'test'
        for ch in self.choices:
            if ch.isChecked():
                ch.stateChanged.connect(self.disable_mod)
            else:
                ch.stateChanged.connect(self.enable_mod)

class Rename(QtCore.QObject):
    enable = QtCore.pyqtSignal
    disable = QtCore.pyqtSignal

app = QtGui.QApplication(sys.argv)
ex = ModEdit("Minecraft ModEdit", "ModEdit.png", 64, 64, 640, 480)
sys.exit(app.exec_())
4

1 に答える 1

3

問題は、stateChanged初期化中に一度だけチェックボックス信号を接続していることです。チェックボックスの状態が変化した後、信号を切断して正しいスロットに再接続していません。

stateChangedチェックボックスの状態に基づいて呼び出す関数を決定する中間スロットに信号を接続する必要があります。複数のチェックボックスに同じスロットを使用しているため、チェックボックスもスロットに渡すのがおそらく最善です。

from functools import partial

def init(self):
    ...
    for tmp in list_of_checkboxes:
        enable_slot = partial(self.enable_mod, tmp)
        disable_slot = partial(self.disable_mod, tmp)
        tmp.stateChanged.connect(lambda x: enable_slot() if x else disable_slot())

def enable_mod(self, checkbox):
    print "ENABLE_TEST"
    print checkbox.isChecked()

def disable_mod(self, checkbox):
    print "DISABLE_TEST"
    print checkbox.isChecked()

または、チェックボックスをスロットに渡しているため、単一のスロットを使用して、スロット内のチェックボックスの状態を確認することもできます

def init(self):
    ...
    for tmp in list_of_checkboxes:
        slot = partial(self.enable_disable_mod, tmp)
        tmp.stateChanged.connect(lambda x: slot())

def enable_disable_mod(self, checkbox):
    if checkbox.isChecked():
        ...
    else:
        ...
于 2016-07-18T18:02:37.483 に答える