Флажки MultiSelectable и Non Multselectable в Qt

Я написал простой виджет, в котором есть список QCheckBoxes. Кроме того, в моем классе есть член по имени isMultiselectable, который инициализируется в конструкторе. Когда эта опция TRUE, я хочу, чтобы виджет был множественным (то есть пользователь может установить более одного QCheckBox). В противном случае это должно предотвратить множественный выбор QCheckBoxes.

Каков рекомендуемый способ реализации этого? Спасибо.

1

Решение

Существует как минимум три способа решения этой проблемы, но я бы посоветовал вам сделать третий, если второй вариант в вашем случае невозможен:

  • Вы можете реализовать шаблон посредника самостоятельно

Идея состоит в том, что вы получите «выбранный» сигнал для каждой кнопки, а затем отмените выбор всех остальных.

  • Переключение между QRadioButtons и QCheckBoxes.

Вы можете просто переключаться между переключателями и обычными флажками в зависимости от значения логической переменной isMultiselectable

  • Используйте шаблон посредника, но с помощью QSignalMapper учебный класс

Вы можете использовать следующие сигналы ниже, чтобы добиться этого на основе ваших предпочтений. Я бы лично предложил использовать то, что вы находите более понятным, пусть это будет целое число, строка или виджет.

ИНТ

void QSignalMapper :: mapped (int i) [сигнал]

Этот сигнал испускается, когда map () сигнализируется от объекта, у которого установлен набор целочисленных отображений. Отображенное целое число объекта передается в i.

QString

void QSignalMapper :: mapped (const QString & текст) [сигнал]

Этот сигнал испускается, когда map () сигнализируется от объекта, для которого установлено отображение строки. Отображаемая строка объекта передается в тексте.

QWidget

void QSignalMapper :: mapped (QWidget * widget) [сигнал]

Этот сигнал испускается, когда map () сигнализируется от объекта, у которого установлен набор отображений виджетов. Отображаемый виджет объекта передается в виджет.

QObject

void QSignalMapper :: mapped (QObject * object) [сигнал]

Этот сигнал испускается, когда 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

1

Другие решения

Немногоотключаемые флажки будут сбивать с толку пользователей. Вы не должны этого делать. Когда вам нужен множественный выбор, используйте флажки. Когда вам нужен одиночный выбор, используйте вместо этого переключатели. QRadioButtonпо умолчанию можно выбрать один.

2

По вопросам рекламы [email protected]