Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QLineEdit中更改QCompleter结果_Qt - Fatal编程技术网

Qt 在QLineEdit中更改QCompleter结果

Qt 在QLineEdit中更改QCompleter结果,qt,Qt,QLineEdit用于输入邮政编码。用户还可以输入城市名称,QCompleter将显示名称列表供用户选择。问题是,在completer中选择名称时,如何将post代码放入QLineEdit? 我试图将QCompleter::activated(QModelIndex)连接到将QLineEdit文本更改为post代码的插槽。但是后来,文本又被QLineEdit设置为城市名称。对不起,我之前的答案不正确,所以我已经编辑了它 正如文件所说: QString QCompleter::pathFromIn

QLineEdit
用于输入邮政编码。用户还可以输入城市名称,
QCompleter
将显示名称列表供用户选择。问题是,在completer中选择名称时,如何将post代码放入
QLineEdit

我试图将
QCompleter::activated
QModelIndex
)连接到将
QLineEdit
文本更改为post代码的插槽。但是后来,文本又被
QLineEdit
设置为城市名称。对不起,我之前的答案不正确,所以我已经编辑了它

正如文件所说:

QString QCompleter::pathFromIndex(常量QModelIndex&index)常量 [虚拟]

返回给定索引的路径。完成对象 使用此选项从基础模型获取完成文本。这个 默认实现返回列表项的编辑角色 模型。如果模型是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;
}
class CodeCompleter:public QCompleter
{
Q_对象
公众:
显式CodeCompleter(QObject*parent=0);
静态常量完成符;
QString pathFromIndex(const QModelIndex&index)const;
};
const int CodeCompleter::CompleteRole=Qt::UserRole+1;
CodeCompleter::CodeCompleter(QObject*父对象):
QCompleter(父级)
{
}
QString
CodeCompleter::pathFromIndex(常量QModelIndex&index)常量
{
QMap data=model()->itemData(索引);
QString代码=data.value(CompleteRole).toString();
返回码;
}
您可以这样使用它:

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);
QStringList城市;
城市模型(模型);
completer->SetCaseSensitive(Qt::CaseSensitive);
lineEdit->setCompleter(完成器);
使用“setCompletionRole(CompleteRole)”,用户必须输入完成提示的post代码,而不是名称。