QLineEdit
用于输入邮政编码。用户也可以输入城市名称,同时QCompleter
会显示一个名称列表供用户选择。问题是,在完成者中选择名称时,如何将邮政编码放入QLineEdit
?我尝试将QCompleter::activated
( ) 连接到将文本更改为邮政编码QModelIndex
的插槽。QLineEdit
但后来文本再次被设置为城市名称QLineEdit
。
问问题
2329 次
1 回答
2
对不起,我之前的答案不正确,所以我已经编辑了它。
正如文档所说:
QString QCompleter::pathFromIndex ( const QModelIndex & index ) const [虚拟]
返回给定索引的路径。完成者对象使用它从底层模型中获取完成文本。默认实现返回列表模型的项目的编辑角色。如果模型是 QDirModel,它返回绝对文件路径。
QCompleter
通过子类化和重新实现,我得到了你需要的东西pathFromIndex
:
class CodeCompleter : public QCompleter
{
Q_OBJECT
public:
explicit CodeCompleter(QObject *parent = 0);
static const int CompleteRole;
QString pathFromIndex(const QModelIndex &index) const;
};
const int CodeCompleter::CompleteRole = Qt::UserRole + 1;
CodeCompleter::CodeCompleter(QObject *parent) :
QCompleter(parent)
{
}
QString
CodeCompleter::pathFromIndex(const QModelIndex &index) const
{
QMap<int, QVariant> data = model()->itemData(index);
QString code = data.value(CompleteRole).toString();
return code;
}
你可以像这样使用它:
QStringList cities;
cities << "Moscow" << "London" << "Las Vegas" << "New York";
QStandardItemModel *model = new QStandardItemModel;
for (int i = 0; i < cities.count(); ++i)
{
QString city = cities.at(i);
QString code = city.at(0) + QString::number(city.length());///< just an example
QStandardItem *item = new QStandardItem;
item->setText(city);
item->setData(code, CodeCompleter::CompleteRole);
model->appendRow(item);
}
QLineEdit *lineEdit = new QLineEdit(this);
CodeCompleter *completer = new CodeCompleter(this);
completer->setModel(model);
completer->setCaseSensitivity(Qt::CaseInsensitive);
lineEdit->setCompleter(completer);
于 2013-01-17T07:14:01.760 回答