Question

I'm trying to keep track of the textChanged() signal on for handful of QTextEdits. I want to do the same thing regardless of the text edit emitting the signal: uncheck its associated checkbox in a QListWidget if it becomes empty and leave it checked otherwise. The function I have so for is as follows:

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);
    }
}

With the current approach, I would have to make a function like this for every QTextEdit; each function containing virtually identical code. If I stored each of the text edits in an array (so I could find their associated index in the QListWidget), would it be possible for me to have a slot like this?

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);
    }
}

Is this possible or should I just create a separate slot for every text edit? Please let me know if any further clarification is needed!

Lastly, I feel like the only meaningful difference between QLineEdits and QTextEdits is the default size. In favor of keeping things consistent, should I just use one of these objects throughout my UI?

Thanks!!!

Was it helpful?

Solution

I think you are missing the point of slots and signals. How are you creating the connections? Are you trying to check a box when any of the text boxes change? If so use a QSignalMapper to map the textChanged() signals to send a value of true and connect that to the QCheckBox setChecked(bool) slot.

If that is too complicated subclass QCheckBox and create a set of functions checkBox() uncheckBox() so you can toggle states without a variable. Then connect the QTextEdit textChanged() to your subclass checkBox()

If this is not what you are looking for, at least subclass QTextEditto take in a QCheckBox that it can change when the text changes instead of duplicating code for every QTextEdit

OTHER TIPS

All you need is a hash of QAbstractButton*, keyed by QTextEdit*. In the slot, you look up the sender() in the hash, if found you've got the button you need. This is precisely what is done by the QSignalMapper: you can map from a sender QWidget* to your button QWidget*. Use qobject_cast to cast to QAbstractButton*.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top