Qt中的MultiSelectable和Non Multiselectable复选框

Posted

技术标签:

【中文标题】Qt中的MultiSelectable和Non Multiselectable复选框【英文标题】:MultiSelectable and Non Multiselectable checkboxes in Qt 【发布时间】:2013-09-28 09:13:47 【问题描述】:

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

推荐的实现方式是什么?谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

您可以自己实现中介者模式

您的想法是您为每个按钮获得“已选择”信号,然后取消选择所有其他按钮。

在 QRadioButtons 和 QCheckBoxes 之间切换。

您可以根据布尔变量isMultiselectable 的值在单选按钮和常规复选框之间简单地切换

使用中介者模式,但要借助 QSignalMapper

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

int

void QSignalMapper::mapped(int i) [信号]

当 map() 从具有整数映射集的对象发出信号时,会发出此信号。对象的映射整数传入 i。

QString

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

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

QWidget

void QSignalMapper::mapped(QWidget * widget) [信号]

当 map() 从具有小部件映射集的对象发出信号时,会发出此信号。对象的映射小部件在小部件中传递。

QObject

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)

    ...

您可以在此处找到有关该类及其用途的文档:

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

【讨论】:

以上是关于Qt中的MultiSelectable和Non Multiselectable复选框的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick 2 应用程序中的非本机对话框

char* 给CString 赋值。

Qt 线程关联和 moveToThread 的问题

C++ 非 QT 接口和 QtNetwork

洛谷 2405 non天平

洛谷P2405 non天平