Qt中的MultiSelectable和Non Multlectlectable复选框

时间:2013-09-28 09:13:47

标签: c++ qt qtgui mediator qt-signals

我写了一个简单的小部件,它有一个QCheckBoxes列表。此外,我的类有一个名为isMultiselectable的成员,它在构造函数中初始化。当此选项为TRUE时,我希望窗口小部件是多选的(即用户可以设置多个QCheckBox)。否则,它必须防止多次选择QCheckBox。

推荐的实施方法是什么?谢谢。

2 个答案:

答案 0 :(得分:2)

非多选复选框会让用户感到困惑。你不应该这样做。如果需要多选,请使用复选框。当您需要单选时,请改用单选按钮。 QRadioButton默认情况下是单选的。

答案 1 :(得分:1)

至少有三种方法可以解决这个问题,但如果在您的用例中无法实现第二种方法,我建议您做第三种方法:

  • 您可以自己实施中介模式

这个想法是你得到每个按钮的“选定”信号,然后你取消选择所有其他信号。

  • 在QRadioButtons和QCheckBox之间切换。

您可以根据布尔变量isMultiselectable

的值简单地在单选按钮和常规复选框之间切换
  • 使用中介模式,但借助QSignalMapper

您可以根据自己的喜好使用以下信号来实现此目的。我个人建议使用你觉得更容易理解的东西,让它为整数,字符串或小部件。

INT

  

void QSignalMapper :: mapped(int i)[signal]

     

当从具有整数映射集的对象发信号通知map()时,将发出此信号。对象的映射整数在i。

中传递

的QString

  

void QSignalMapper :: mapped(const QString& text)[signal]

     

当从具有字符串映射集的对象发出信号时发出此信号。对象的映射字符串以文本形式传递。

QWidget的

  

void QSignalMapper :: mapped(QWidget * widget)[signal]

     

当从具有窗口小部件映射集的对象发出信号时发出此信号。对象的映射小部件在小部件中传递。

的QObject

  

void QSignalMapper :: mapped(QObject * object)[signal]

     

当从具有对象映射集的对象发信号通知map()时,将发出此信号。地图提供的对象在对象中传递。

然后,您将通过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)

    ...
}

您可以在此处找到课程及其用途的文档:

http://qt-project.org/doc/qt-5.1/qtcore/qsignalmapper.html