2014-06-11 27 views
0

經過很多搜索沒有正確答案的網頁後,我來幫助你們......所以讓我看看我能否解釋它。QCompleter,如何從數據庫中獲得Id

我正在使用QT5的用戶界面,我希望通過自動填充來編輯行。我知道我可以使用QCompleter,它工作正常。我用Qry填充QCompleter進行迭代(for)。但我需要知道該字段的ID。

例如:

如果我做一個查詢到具有PRODUCT_NAME和PRODUCT_CODE數據庫,用戶將鍵入prodcut的名稱,並在每個text_edit事件我填的是QCompleter用新數據,但是當用戶選擇產品時,我想在其他地方展示代碼,當然可能有兩個或多個產品具有相同的名稱但代碼不同,因此在搜索後我無法查找代碼。

那麼有沒有辦法在QCompleter中擁有兩個realted字段?

我已經試着製作一個帶有隱藏列的QTableWidget(帶代碼)並將其顯示在QlineEdit的底部(模擬Qcompleter),它看起來很好,它可以工作......但我不知道如何添加Qcompleter所具有的功能,向下箭頭將跳到表中,並且在lineedit失去焦點時使其消失,但在選擇表時不會。

任何幫助將不勝感激!感謝您抽出寶貴時間閱讀本文,並對錯誤的英文感到抱歉!

回答

1

你可以把額外的數據在完成試驗模型:

QMap<int, QString> data; 
data[0] = "Moscow"; 
data[1] = "London"; 
data[2] = "Paris"; 

QCompleter *completer = new QCompleter(this); 

QStandardItemModel *model = new QStandardItemModel(completer); 
QMapIterator<int, QString> it(data); 
while (it.hasNext()) 
{ 
    it.next(); 

    int code = it.key(); 
    QString name = it.value(); 

    QStandardItem *item = new QStandardItem; 
    item->setText(name); 
    item->setData(code, Qt::UserRole); 

    model->appendRow(item); 
} 

completer->setModel(model); 

然後你連接到QCompleteractivated(const QModelIndex &index)信號捕捉自動完成動作並顯示額外的數據,你想:

connect(completer, SIGNAL(activated(QModelIndex)), 
      this, SLOT(onItemActivated(QModelIndex))); 

void Widget::onItemActivated(const QModelIndex &index) 
{ 
    int code = index.data(Qt::UserRole).toInt(); 

    codeEdit->setText(QString::number(code)); 
} 

但是這種做法贏得了如果用戶不使用自動填充並鍵入整個字符串,則不起作用。在這種情況下,如果數據庫中有多個具有相同名稱的記錄,則無法獲得正確的代碼ID。

如果您嘗試創建某種搜索字段,我建議您在某個表格視圖中顯示所有數據,並使用QSortFilterProxyModel在行編輯中顯示與用戶輸入相匹配的記錄。