选择与复选框的交互式交互
Interactive interaction of selections with checkboxes
我有一个弹出窗口 window,它在其中读取选项列表并将其填充到组框和复选框中。
我有一个 selection,其中包含以下数据:
my_selection = {'drinks': ['coffee'], 'snacks': ['m&m']}
我正在尝试获取选项 - coffee
和 -m&m
在弹出窗口 window.
中选中
但是我的 selection 可以变化,意思是,itemA 可能有 drinks
个项目,如果我 select itemA(itemA 不再在 selection),它可能有 drinks
中的一个项目和 snacks
中的 2 个项目,我想确保选中正确的选项,以防万一,如果项目命名相同但名称不同类别或反之亦然。
我尝试将 selection 外壳插入 class,如下所示:
class FormWindow(QtGui.QWidget):
def __init__(self, main_items, my_selection, parent=None, callback=None):
...
if my_selection:
for k, v in my.items():
for i in v:
if sub_chk.text() == i:
sub_chk.setChecked(True)
它只检查它找到的最新项目,在这种情况下,只考虑 Snacks
中的项目。
import sys
from PyQt4 import QtGui, QtCore
from collections import defaultdict
class FormWindow(QtGui.QWidget):
def __init__(self, main_items, parent=None, callback=None):
super(FormWindow, self).__init__(parent=parent)
self.callback = callback
layout = QtGui.QVBoxLayout()
self.checkbox_options = []
self.menu_tag_dict = defaultdict(set)
for main_name, sub_name in main_items.items():
# Set the main item
groupbox = QtGui.QGroupBox(self)
groupbox.setTitle(main_name.title())
groupbox.setLayout(QtGui.QVBoxLayout())
layout.addWidget(groupbox)
if sub_name:
# sub_txt = [(action.text()) for action in sub_name]
sub_txt = [action for action in sub_name]
# Creates QCheckbox for each option
for s in sub_txt:
sub_chk = QtGui.QCheckBox(s)
self.checkbox_options.append(sub_chk)
groupbox.layout().addWidget(sub_chk)
layout.addStretch()
self.setLayout(layout)
self.setWindowTitle('Form Checking')
self.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_items = {'drinks': ['coffee', 'tea', 'water'], 'snacks': ['biscuits', 'm&m']}
my_win = FormWindow(main_items)
sys.exit(app.exec_())
# Example1 of what my selection will return
my_selection = {'drinks': ['coffee'], 'snacks': ['m&m']}
# Example2 of what my selection will return
my_selection = {'drinks': ['water', 'coffee'], 'snacks': ['biscuits']}
假设你要获取勾选的项目,那么你应该做的是根据勾选的状态通过删除或添加选择来反映数据,在下面的例子中,如果你按下按钮,将打印选中的项目:
import sys
from PyQt4 import QtGui, QtCore
from functools import partial
class FormWindow(QtGui.QWidget):
checkbox_options_changed = QtCore.pyqtSignal(dict)
def __init__(self, main_items, parent=None, callback=None):
super(FormWindow, self).__init__(parent=parent)
self.callback = callback
layout = QtGui.QVBoxLayout(self)
self.checkbox_options = {}
for main_name, sub_name in main_items.items():
groupbox = QtGui.QGroupBox()
groupbox.setTitle(main_name.title())
lay = QtGui.QVBoxLayout(groupbox)
layout.addWidget(groupbox)
self.checkbox_options[main_name] = set()
for s in sub_name:
sub_chk = QtGui.QCheckBox(s)
info = (main_name, s)
wrapper = partial(self.on_stateChanged, info)
sub_chk.stateChanged.connect(wrapper)
lay.addWidget(sub_chk)
layout.addStretch()
self.setWindowTitle("Form Checking")
@QtCore.pyqtSlot(tuple, QtCore.Qt.CheckState)
def on_stateChanged(self, info, state):
name, item = info
option = self.checkbox_options[name]
if state == QtCore.Qt.Checked:
option.add(item)
else:
if item in option:
option.remove(item)
self.checkbox_options_changed.emit(self.checkbox_options)
def get_checked_items(self):
return self.checkbox_options
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_items = {
"drinks": ["coffee", "tea", "water"],
"snacks": ["biscuits", "m&m"],
}
my_win = FormWindow(main_items)
w = QtGui.QWidget()
lay = QtGui.QVBoxLayout(w)
button = QtGui.QPushButton("Print me")
lay.addWidget(button)
lay.addWidget(my_win)
def on_clicked():
print(my_win.get_checked_items())
button.clicked.connect(on_clicked)
my_win.checkbox_options_changed.connect(print)
w.show()
sys.exit(app.exec_())
{'drinks': {'coffee', 'tea'}, 'snacks': set()}
{'drinks': {'coffee', 'tea'}, 'snacks': {'biscuits'}}
我有一个弹出窗口 window,它在其中读取选项列表并将其填充到组框和复选框中。
我有一个 selection,其中包含以下数据:
my_selection = {'drinks': ['coffee'], 'snacks': ['m&m']}
我正在尝试获取选项 - coffee
和 -m&m
在弹出窗口 window.
但是我的 selection 可以变化,意思是,itemA 可能有 drinks
个项目,如果我 select itemA(itemA 不再在 selection),它可能有 drinks
中的一个项目和 snacks
中的 2 个项目,我想确保选中正确的选项,以防万一,如果项目命名相同但名称不同类别或反之亦然。
我尝试将 selection 外壳插入 class,如下所示:
class FormWindow(QtGui.QWidget):
def __init__(self, main_items, my_selection, parent=None, callback=None):
...
if my_selection:
for k, v in my.items():
for i in v:
if sub_chk.text() == i:
sub_chk.setChecked(True)
它只检查它找到的最新项目,在这种情况下,只考虑 Snacks
中的项目。
import sys
from PyQt4 import QtGui, QtCore
from collections import defaultdict
class FormWindow(QtGui.QWidget):
def __init__(self, main_items, parent=None, callback=None):
super(FormWindow, self).__init__(parent=parent)
self.callback = callback
layout = QtGui.QVBoxLayout()
self.checkbox_options = []
self.menu_tag_dict = defaultdict(set)
for main_name, sub_name in main_items.items():
# Set the main item
groupbox = QtGui.QGroupBox(self)
groupbox.setTitle(main_name.title())
groupbox.setLayout(QtGui.QVBoxLayout())
layout.addWidget(groupbox)
if sub_name:
# sub_txt = [(action.text()) for action in sub_name]
sub_txt = [action for action in sub_name]
# Creates QCheckbox for each option
for s in sub_txt:
sub_chk = QtGui.QCheckBox(s)
self.checkbox_options.append(sub_chk)
groupbox.layout().addWidget(sub_chk)
layout.addStretch()
self.setLayout(layout)
self.setWindowTitle('Form Checking')
self.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_items = {'drinks': ['coffee', 'tea', 'water'], 'snacks': ['biscuits', 'm&m']}
my_win = FormWindow(main_items)
sys.exit(app.exec_())
# Example1 of what my selection will return
my_selection = {'drinks': ['coffee'], 'snacks': ['m&m']}
# Example2 of what my selection will return
my_selection = {'drinks': ['water', 'coffee'], 'snacks': ['biscuits']}
假设你要获取勾选的项目,那么你应该做的是根据勾选的状态通过删除或添加选择来反映数据,在下面的例子中,如果你按下按钮,将打印选中的项目:
import sys
from PyQt4 import QtGui, QtCore
from functools import partial
class FormWindow(QtGui.QWidget):
checkbox_options_changed = QtCore.pyqtSignal(dict)
def __init__(self, main_items, parent=None, callback=None):
super(FormWindow, self).__init__(parent=parent)
self.callback = callback
layout = QtGui.QVBoxLayout(self)
self.checkbox_options = {}
for main_name, sub_name in main_items.items():
groupbox = QtGui.QGroupBox()
groupbox.setTitle(main_name.title())
lay = QtGui.QVBoxLayout(groupbox)
layout.addWidget(groupbox)
self.checkbox_options[main_name] = set()
for s in sub_name:
sub_chk = QtGui.QCheckBox(s)
info = (main_name, s)
wrapper = partial(self.on_stateChanged, info)
sub_chk.stateChanged.connect(wrapper)
lay.addWidget(sub_chk)
layout.addStretch()
self.setWindowTitle("Form Checking")
@QtCore.pyqtSlot(tuple, QtCore.Qt.CheckState)
def on_stateChanged(self, info, state):
name, item = info
option = self.checkbox_options[name]
if state == QtCore.Qt.Checked:
option.add(item)
else:
if item in option:
option.remove(item)
self.checkbox_options_changed.emit(self.checkbox_options)
def get_checked_items(self):
return self.checkbox_options
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_items = {
"drinks": ["coffee", "tea", "water"],
"snacks": ["biscuits", "m&m"],
}
my_win = FormWindow(main_items)
w = QtGui.QWidget()
lay = QtGui.QVBoxLayout(w)
button = QtGui.QPushButton("Print me")
lay.addWidget(button)
lay.addWidget(my_win)
def on_clicked():
print(my_win.get_checked_items())
button.clicked.connect(on_clicked)
my_win.checkbox_options_changed.connect(print)
w.show()
sys.exit(app.exec_())
{'drinks': {'coffee', 'tea'}, 'snacks': set()}
{'drinks': {'coffee', 'tea'}, 'snacks': {'biscuits'}}