Я написал простой виджет, в котором есть список QCheckBoxes. Кроме того, в моем классе есть член по имени isMultiselectable
, который инициализируется в конструкторе. Когда эта опция TRUE, я хочу, чтобы виджет был множественным (то есть пользователь может установить более одного QCheckBox). В противном случае это должно предотвратить множественный выбор QCheckBoxes.
Каков рекомендуемый способ реализации этого? Спасибо.
Существует как минимум три способа решения этой проблемы, но я бы посоветовал вам сделать третий, если второй вариант в вашем случае невозможен:
Идея состоит в том, что вы получите «выбранный» сигнал для каждой кнопки, а затем отмените выбор всех остальных.
Вы можете просто переключаться между переключателями и обычными флажками в зависимости от значения логической переменной isMultiselectable
QSignalMapper
учебный классВы можете использовать следующие сигналы ниже, чтобы добиться этого на основе ваших предпочтений. Я бы лично предложил использовать то, что вы находите более понятным, пусть это будет целое число, строка или виджет.
void QSignalMapper :: mapped (int i) [сигнал]
Этот сигнал испускается, когда map () сигнализируется от объекта, у которого установлен набор целочисленных отображений. Отображенное целое число объекта передается в i.
void QSignalMapper :: mapped (const QString & текст) [сигнал]
Этот сигнал испускается, когда map () сигнализируется от объекта, для которого установлено отображение строки. Отображаемая строка объекта передается в тексте.
void QSignalMapper :: mapped (QWidget * widget) [сигнал]
Этот сигнал испускается, когда map () сигнализируется от объекта, у которого установлен набор отображений виджетов. Отображаемый виджет объекта передается в виджет.
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)
...
}
Вы можете найти документацию здесь для класса и его использования:
Немногоотключаемые флажки будут сбивать с толку пользователей. Вы не должны этого делать. Когда вам нужен множественный выбор, используйте флажки. Когда вам нужен одиночный выбор, используйте вместо этого переключатели. QRadioButton
по умолчанию можно выбрать один.