Подключение нескольких сигналов к одному слоту в Qt

Я пытаюсь отслеживать сигнал textChanged() для нескольких QTextEdits. Я хочу сделать то же самое независимо от редактирования текста, испускающего сигнал: снимите соответствующий флажок в QListWidget, если он станет пустым, и оставьте его установленным в противном случае. Функция, которую я так использую, выглядит следующим образом:

void MainWindow::changed()
{
    QString tempStr = ui->hNMRedit->toPlainText();
    if(tempStr != "")
    {
       ui->checkList->item(0)->setCheckState(Qt::Checked);
    }
    else
    {
       ui->checkList->item(0)->setCheckState(Qt::Unchecked);
    }
}

При нынешнем подходе мне пришлось бы создавать такую ​​функцию для каждого QTextEdit; каждая функция содержит практически идентичный код. Если бы я сохранил каждое текстовое редактирование в массиве (чтобы я мог найти связанный с ним индекс в QListWidget), возможно ли было бы, чтобы у меня был такой слот?

void MainWindow::changed(QWidget *sender)   // for whichever text edit emits the
                                            // textChanged() signal
{
    QString tempStr = sender->toPlainText();
    if(tempStr != "")
    {
       // I would potentially use some sort of indexOf(sender) function on the array I 
       // mentioned earlier here... a little new to Qt, sorry
       ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Checked);
    }
    else
    {
       // same as above...
       ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Unchecked);
    }
}

Возможно ли это, или я должен просто создать отдельный слот для каждого редактирования текста? Пожалуйста, дайте мне знать, если необходимы какие-либо дополнительные разъяснения!

Наконец, я чувствую, что единственная значимая разница между QLineEdits и QTextEdits — это размер по умолчанию. В пользу сохранения согласованности, должен ли я просто использовать один из этих объектов в своем пользовательском интерфейсе?

Спасибо!!!


person Alex Wood    schedule 30.01.2010    source источник


Ответы (2)


Я думаю, что вы упускаете смысл слотов и сигналов. Как вы создаете связи? Вы пытаетесь установить флажок, когда любое из текстовых полей изменяется? Если это так, используйте QSignalMapper для сопоставления сигналов textChanged() для отправки значения true и подключения это в слот QCheckBox setChecked(bool).

Если это слишком сложно, создайте подкласс QCheckBox и создайте набор функций checkBox() uncheckBox(), чтобы вы могли переключать состояния без переменной. Затем подключите QTextEdit textChanged() к вашему подклассу checkBox()

Если это не то, что вы ищете, по крайней мере, подкласс QTextEdit, чтобы взять QCheckBox, который он может изменить при изменении текста, вместо дублирования кода для каждого QTextEdit.

person Adam W    schedule 30.01.2010
comment
Я согласен с QSignalMapper... Это значительно упростит управление на основе массива. - person Caleb Huitt - cjhuitt; 31.01.2010
comment
Звучит хорошо, я попробую QSignalMapper. Единственная трудность заключается в том, что QCheckBox находятся в QListWidget... Я не знаю, смогу ли я подключить проверенный слот, как вы описали. Вы все еще думаете, что он сможет работать? Есть также некоторые QLineEdits, которые я хотел бы подключить к одному слоту, о котором я упоминал ранее. Для удобства я должен просто изменить их все на QTextEdits (чтобы я мог сохранить их в массиве и использовать ту же функцию для получающего объекта)? - person Alex Wood; 31.01.2010
comment
QCheckBoxes: Да, либо во время создания, либо после, у вас есть к ним доступ. Если вы попытаетесь получить к ним доступ после того, как поместите их в список, вам нужно либо сохранить указатель, либо привести их после вызова одной из функций получения элемента. QLineEdits: вам не нужно хранить их как QWidget указатели и отбрасывать их, когда вам нужны определенные функции. - person Adam W; 31.01.2010
comment
Адам, большое спасибо за помощь. Мой последний вопрос был добавлен к моему исходному сообщению, поэтому код можно прочитать... - person Alex Wood; 01.02.2010
comment
Я думаю, что ваш вызов setMapping неверен, параметры должны быть textEdits[i], а не редактироваться. Если редактирование — это что-то еще, что мне не хватает, это немного сложно читать в формате комментариев. - person Adam W; 01.02.2010
comment
Код находится в более читаемом формате в моем исходном посте, если вы хотите взглянуть - я недавно отредактировал его, чтобы включить упомянутый код. Извините, забыл изменить параметры. Преобразователь сигналов по-прежнему не будет подключать каждый textEdit к соответствующему слоту. Нужно ли мне добавить дополнительный оператор подключения или что-то в этом роде? - person Alex Wood; 01.02.2010
comment
Сейчас я нигде не вижу кода QSignalMapper. Процесс заключается в подключении сигнала к преобразователю сигналов. Установите сопоставление на сигнальном картографе. Подключите преобразованный сигнал преобразователя сигналов к принимающему слоту. Таким образом, теперь должно быть 2 подключения на пару. - person Adam W; 01.02.2010

Все, что вам нужно, это хэш QAbstractButton* с ключом QTextEdit*. В слоте вы ищете sender() в хэше, если нашли, что у вас есть нужная кнопка. Именно это и делает QSignalMapper: вы можете сопоставить отправителя QWidget* с вашей кнопкой QWidget*. Используйте qobject_cast для приведения к QAbstractButton*.

person Kuba hasn't forgotten Monica    schedule 07.05.2012