我正在尝试跟踪少数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中使用其中一个对象吗?
感谢!!!
答案 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*
。