QTableWidget 和 QLineEdit - 位置和文本内容
QTableWidget and QLineEdit - position and text content
我很难弄清楚如何在 QLineEdit 中获取位置(列和行)和内容。我正在使用 eventFilter 来获取信号,但我被卡住了。有什么建议吗?谢谢
ui->tableWidget->setRowCount(5);
ui->tableWidget->setColumnCount(5);
QStringList wordList;
wordList << "alpha" << "omega" << "omega2" << "omega3" <<"omicron" << "zeta";
for(int i = 0; i<5;i++)
{
QLineEdit *lineEdit = new QLineEdit;
QCompleter *completer = new QCompleter(wordList);
completer->setCaseSensitivity(Qt::CaseInsensitive);
lineEdit->installEventFilter(this);
lineEdit->setCompleter(completer);
ui->tableWidget->setCellWidget(i,i,lineEdit);
}
....
bool MainWindow::eventFilter(QObject * object, QEvent *event)
{
}
我想在完成编辑后获得位置。我想通过上下键或单击鼠标左键从列表中选择一个单词。一旦选择了一个词,该词将填充 QLineEdit。然后我想知道位置。现在,如果用户写的文本与列表的内容不同,则不应返回任何位置。我只对 "wordList" 中的内容感兴趣。谢谢
正如您在评论中指出的那样,您只想在选择 QCompleter
中设置的元素时获取文本,为此我们必须使用 void QCompleter::activated(const QString & text)
信号。
为此,创建一个插槽并建立连接:
*.h
private slots:
void onActivated(const QString &text);
*.cpp
QCompleter *completer = new QCompleter(wordList);
...
connect(completer, qOverload<const QString &>(&QCompleter::activated), this, &MainWindow::onActivated);
有 2 种可能的解决方案:
- 首先使用
QCompleter
的widget()
方法得到的QLineEdit
的位置,QCompleter
我们通过[=得到的QCompleter
的位置20=] 是发出信号的对象,pos()
。然后我们得到 QModelIndex
和 indexAt()
,这有行和列的信息:
void MainWindow::onActivated(const QString &text)
{
QCompleter *completer = static_cast<QCompleter *>(sender());
QModelIndex ix = ui->tableWidget->indexAt(completer->widget()->pos());
if(ix.isValid()){
qDebug()<<ix.row()<<ix.column()<<text;
}
}
- 或者行和列保存为属性:
QCompleter *completer = new QCompleter(wordList);
...
completer->setProperty("row", i);
completer->setProperty("column", i);
void MainWindow::onActivated(const QString &text)
{
QCompleter *completer = static_cast<QCompleter *>(sender());
qDebug()<< completer->property("row").toInt()<<completer->property("column").toInt()<<text;
}
在下面link你可以找到两个完整的例子
我很难弄清楚如何在 QLineEdit 中获取位置(列和行)和内容。我正在使用 eventFilter 来获取信号,但我被卡住了。有什么建议吗?谢谢
ui->tableWidget->setRowCount(5);
ui->tableWidget->setColumnCount(5);
QStringList wordList;
wordList << "alpha" << "omega" << "omega2" << "omega3" <<"omicron" << "zeta";
for(int i = 0; i<5;i++)
{
QLineEdit *lineEdit = new QLineEdit;
QCompleter *completer = new QCompleter(wordList);
completer->setCaseSensitivity(Qt::CaseInsensitive);
lineEdit->installEventFilter(this);
lineEdit->setCompleter(completer);
ui->tableWidget->setCellWidget(i,i,lineEdit);
}
....
bool MainWindow::eventFilter(QObject * object, QEvent *event)
{
}
我想在完成编辑后获得位置。我想通过上下键或单击鼠标左键从列表中选择一个单词。一旦选择了一个词,该词将填充 QLineEdit。然后我想知道位置。现在,如果用户写的文本与列表的内容不同,则不应返回任何位置。我只对 "wordList" 中的内容感兴趣。谢谢
正如您在评论中指出的那样,您只想在选择 QCompleter
中设置的元素时获取文本,为此我们必须使用 void QCompleter::activated(const QString & text)
信号。
为此,创建一个插槽并建立连接:
*.h
private slots:
void onActivated(const QString &text);
*.cpp
QCompleter *completer = new QCompleter(wordList);
...
connect(completer, qOverload<const QString &>(&QCompleter::activated), this, &MainWindow::onActivated);
有 2 种可能的解决方案:
- 首先使用
QCompleter
的widget()
方法得到的QLineEdit
的位置,QCompleter
我们通过[=得到的QCompleter
的位置20=] 是发出信号的对象,pos()
。然后我们得到QModelIndex
和indexAt()
,这有行和列的信息:
void MainWindow::onActivated(const QString &text)
{
QCompleter *completer = static_cast<QCompleter *>(sender());
QModelIndex ix = ui->tableWidget->indexAt(completer->widget()->pos());
if(ix.isValid()){
qDebug()<<ix.row()<<ix.column()<<text;
}
}
- 或者行和列保存为属性:
QCompleter *completer = new QCompleter(wordList);
...
completer->setProperty("row", i);
completer->setProperty("column", i);
void MainWindow::onActivated(const QString &text)
{
QCompleter *completer = static_cast<QCompleter *>(sender());
qDebug()<< completer->property("row").toInt()<<completer->property("column").toInt()<<text;
}
在下面link你可以找到两个完整的例子