2014-09-26 25 views
3

所以,我有兩個QLineEdits在lineEDit和fileName_Edit程序中。 lineEdit保存目錄的路徑(從用戶獲取)。然後用戶在fileName_Edit中輸入文件的名稱。我想在用戶輸入fileName_Edit中的文件名時向用戶顯示建議。我試圖執行QCompeter這樣的:
(dirContents是保存用戶在lineEdit指定的目錄中的內容QStringList中)爲什麼使用QCompleter進行自動完成的QLineEdit不顯示?

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    QCompleter *fileEditCompleter = new QCompleter(dirContents, this); 
    fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); 
    fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion); 
    ui->fileName_Edit->setCompleter(fileEditCompleter); 
} 

程序編譯成功,但是,完成者並沒有顯示出來。即使我嘗試將textChanged信號連接到如下所示的函數,它也不會顯示出來。

QObject::connect(&MainWindow::ui->lineEdit, SIGNAL(&textChanged(QString)), this,SLOT(&MainWindow::on_lineEdit_editingFinished())); 

編輯:添加上述行給出了一個錯誤說:Expected constructor, destructor or type-conversion before (token

Anyhelp將大大appreceated。

+1

嘗試設置完成者_before_向用戶提供'QLineEdit'。例如 - 在MainWindow的構造函數中。將其設置在textChanged插槽中是不正確的。 – 2014-09-26 13:36:26

+0

@DmitrySazonov感謝您的回覆,請給出一些示例代碼? – 2014-09-26 13:44:10

+0

我不認爲你需要在lineEdit之前創建Completer。 Qt文檔以同樣的方式執行。但在textChanged插槽中這樣做,不知道這是否如此好。 dirContents來自哪裏也不完全清楚。你確定它不是空的嗎?你確定這個方法被調用嗎?也許你想用editFinished信號來調用它? – 2014-09-26 14:23:36

回答

2

試着做你的代碼簡單,如果下一段代碼適合你,那麼一切正常,並開始改善它。

在構造函數中:

QDir dir("G:/2");//path here 
QStringList dirContents = dir.entryList(QStringList(), QDir::Files); 
qDebug() << dirContents;//make sure that you list isn't empty, or use isEmpty method 
QCompleter *fileEditCompleter = new QCompleter(dirContents, this); 
fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); 
fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion); 
ui->lineEdit->setCompleter(fileEditCompleter); 

如果您的電腦上工作,那麼你一定會認爲你的系統和項目都不錯,並開始改進它(更改列表等)。並嘗試不使用全局變量。

如果你想動態地做到這一點。創建簡單的模型,當你將新的StringList設置它,你的完成者總是可以顯示新的數據

QDir dir("G:/2"); 
QStringList dirContents = dir.entryList(QStringList(), QDir::Files); 

mdl = new QStringListModel(dirContents,this);//QStringListModel *mdl in header 

QCompleter *fileEditCompleter = new QCompleter(mdl, this); 
fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); 
fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion); 
ui->lineEdit->setCompleter(fileEditCompleter); 

當你想要的時候,例如,用戶點擊按鈕或東西elese下一步做更改數據:

QDir dir("G:/2/tmp"); 
mdl->setStringList(dir.entryList(QStringList(), QDir::Files)); 

現在你的完成者有新數據

+0

謝謝!它的工作。我想問一下,如果我將在函數中執行代碼的QDir部分,然後將它與QLineEdit信號連接起來,那麼它會起作用嗎?我必須做一些其他的功能來傳遞QDir對象嗎? – 2014-09-26 18:57:04

+1

@EdwardMckinzie正如你所看到的,我們需要QDir來獲取文件列表,你可以在任何地方使用這個QDir,但是你的列表應該在你想要使用它的所有地方都可見,因爲對你來說最重要的事情是列表和這個列表中的信息,QDir只是一個工具。我希望它有幫助。還有一件事:如果你發現我的和其他答案有用,你可以投票嗎(上三角按)?也謝謝你。 http://stackoverflow.com/help/why-vote – Chernobyl 2014-09-26 19:01:36

+0

嘿,是不是有可能在rpgram中稍後修改dirContents的內容,例如使用QLineEdit或其他?如果是的話。這是因爲當構造函數運行時,它只有'QDir dir()'中的路徑文件,而不是用戶在lineEDit中輸入的內容。因此,無論我在lineEdit中輸入哪條路徑,Qcompleter都會顯示dir()目錄中的文件。我的做法是錯誤的嗎?而且我不認爲構造函數可以在課程/程序開始後調用。那麼你能否提出一個針對上述問題的方法?我會檢查你的其他答案。 – 2014-09-27 03:23:14

2

轉換評論一個答案,根據要求...

嘗試用戶提供QLineEdit的前設置完成者。例如 - 在MainWindow的構造函數中。將其設置在textChanged插槽中是不正確的。

MainWindow::MainWindow() 
    : QWidget(nullptr) 
    , ui(new ui_MainWindow()) 
{ 
    ui->setupUi(this); 
    //... 
    QCompleter *fileEditCompleter = new QCompleter(dirContents, this); 
    fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); 
    fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion); 
    ui->fileName_Edit->setCompleter(fileEditCompleter); 
} 

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    // Do nothing here 
} 
+0

實際上,dirContents是一個全局變量,它從另一個本地qstringlist中獲取它的值。所以當我嘗試你的方法時,它給了我一個錯誤,說'dirContents沒有在這個範圍內聲明:( – 2014-09-26 15:14:39

+0

我照顧了上面的錯誤,通過返回dirContents函數,但問題是,它仍然沒有' t似乎工作。安妮的想法?? – 2014-09-26 15:38:15

+1

+ 1,OP的代碼看起來很複雜,可以有很多錯誤,我建議他從一些簡單的事情開始,並開始做更多更復雜的事情 – Chernobyl 2014-09-26 17:23:01