将多个信号连接到Qt中的单个插槽

时间:2010-01-30 21:22:04

标签: qt signals-slots qtextedit qlineedit

我正在尝试跟踪少数QTextEdits的textChanged()信号。无论发出信号的文本编辑,我都想做同样的事情:如果它变为空,则取消选中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之间唯一有意义的区别是默认大小。为了保持一致性,我应该在整个UI中使用其中一个对象吗?

感谢!!!

2 个答案:

答案 0 :(得分:3)

我认为你错过了插槽和信号的重点。你是如何创建连接的? 您是否尝试在任何文本框更改时检查框?如果是这样,请使用QSignalMapper映射textChanged()信号以发送值true并将其连接到QCheckBox setChecked(bool)插槽。

如果这是太复杂的子类QCheckBox并创建一组函数checkBox() uncheckBox(),那么你可以在没有变量的情况下切换状态。然后将QTextEdit textChanged()连接到您的子类checkBox()

如果这不是您要找的,至少子类QTextEdit接受QCheckBox,它可以在文本更改时更改,而不是为每个QTextEdit重复代码

答案 1 :(得分:0)

您需要的是QAbstractButton*的哈希值,由QTextEdit*键入。在插槽中,您在哈希中查找sender(),如果发现您已获得所需的按钮。这正是QSignalMapper所做的事情:您可以从发件人QWidget*映射到按钮QWidget*。使用qobject_cast转换为QAbstractButton*