Подключение нескольких сигналов к одному слоту в Qt - PullRequest
2 голосов
/ 31 января 2010

Я пытаюсь отследить сигнал 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 - это размер по умолчанию.Чтобы все было согласованно, нужно ли использовать один из этих объектов в моем интерфейсе?

Спасибо !!!

Ответы [ 2 ]

3 голосов
/ 31 января 2010

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

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

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

0 голосов
/ 07 мая 2012

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

...