我写了一个简单的小部件,它有一个 QCheckBoxes 列表。另外,我的类有一个名为 的成员isMultiselectable
,它在构造函数中初始化。当此选项为 TRUE 时,我希望小部件是多选的(即用户可以设置多个 QCheckBox)。否则,它必须防止 QCheckBoxes 的多重选择。
推荐的实施方式是什么?谢谢你。
我写了一个简单的小部件,它有一个 QCheckBoxes 列表。另外,我的类有一个名为 的成员isMultiselectable
,它在构造函数中初始化。当此选项为 TRUE 时,我希望小部件是多选的(即用户可以设置多个 QCheckBox)。否则,它必须防止 QCheckBoxes 的多重选择。
推荐的实施方式是什么?谢谢你。
不可多选的复选框会使用户感到困惑。你不应该这样做。当您需要多选时,请使用复选框。当您需要单选时,请改用单选按钮。QRadioButton
s 默认情况下是单选的。
至少有三种方法可以解决此问题,但如果您的用例中无法使用第二种方法,我建议您使用第三种方法:
这个想法是您获得每个按钮的“选定”信号,然后取消选择所有其他按钮。
您可以根据布尔变量的值简单地在单选按钮和常规复选框之间切换isMultiselectable
QSignalMapper
类的帮助下您可以根据自己的喜好使用以下信号来实现此目的。我个人建议使用您认为更容易理解的任何一个,让它成为整数、字符串或小部件。
void QSignalMapper::mapped(int i) [信号]
当 map() 从具有整数映射集的对象发出信号时,会发出此信号。对象的映射整数传入 i。
void QSignalMapper::mapped(const QString & text) [信号]
当 map() 从具有字符串映射集的对象发出信号时,会发出此信号。对象的映射字符串以文本形式传递。
void QSignalMapper::mapped(QWidget * widget) [信号]
当 map() 从具有小部件映射集的对象发出信号时,会发出此信号。对象的映射小部件在小部件中传递。
void QSignalMapper::mapped(QObject * object) [信号]
当 map() 从具有对象映射集的对象发出信号时,会发出此信号。地图提供的对象传入object。
然后,您将通过 QCheckBoxes 将它们的信号连接到您的处理程序,代码与此有点相似:
#include <QCheckBox>
#include <QStringList>
...
QStringList checkBoxStringList = QStringList() << "foo" << "bar" << "baz";
for (int i = 0; i < checkBoxStringList.size(); ++i) {
QCheckBox *checkBox = new QCheckBox(checkBoxStringList.at(i));
connect(checkBox, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(checkBox, texts.at(i));
gridLayout->addWidget(checkBox, i / 3, i % 3);
}
connect(signalMapper, SIGNAL(mapped(QString)),
this, SIGNAL(myHandler(QString)));
...
void MyClass::myHandler(QString checkBoxString)
{
if (isMultiSelectable)
return;
// Go through the rest and call setChecked(false)
...
}
您可以在此处找到该类及其用途的文档: