2010-01-30 9 views
2

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

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

Спасибо !!!

ответ

3

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

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

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

+0

Я согласен с QSignalMapper ... Это упростит управление на основе массивов. –

+0

Звучит неплохо, я дам QSignalMapper попробовать. Единственная трудная часть - QCheckBoxes в QListWidget ... Я не знаю, смогу ли я подключить проверенный слот, как вы описали. Вы все еще думаете, что он сможет работать? Есть также некоторые QLineEdits, которые я хотел бы подключить к одному слоту, упомянутому ранее. Для удобства я должен просто изменить их все на QTextEdits (чтобы я мог хранить их в массиве и использовать ту же функцию на получающем объекте)? –

+0

'QCheckBoxes': Да, либо во время создания, либо после этого, у вас есть к ним доступ. Если вы попытаетесь получить к ним доступ после того, как вы поместили их в список, вам нужно либо сохранить указатель, либо бросить их после вызова одной из функций get item. 'QLineEdits': вам не нужно, хранить их как указатели QWidget и выставлять их, когда вам нужны определенные функции. –

0

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