2013-01-13 129 views
2

我對Qt相當陌生,如果有人能幫助我解決這個問題,我將不勝感激。 我正在使用Qt Creator並創建了一個帶有PlainTextEdit的表單。我正在嘗試使用if語句來驗證在此文本框中輸入的文本。我做了類似下面的如何將小部件對象傳遞給Qt中的函數?

void validateText (QPlainTextEdit *myWidget) 
{ 
    if ((myWidget->toPlainText().endsWith("1")) || 
     (myWidget->toPlainText().endsWith("2")) || 
     (myWidget->toPlainText().endsWith("3")) || 
     (myWidget->toPlainText().endsWith("4")) || 
     (myWidget->toPlainText().endsWith("5")) || 
     (myWidget->toPlainText().endsWith("6")) || 
     (myWidget->toPlainText().endsWith("7")) || 
     (myWidget->toPlainText().endsWith("8")) || 
     (myWidget->toPlainText().endsWith("9")) || 
     (myWidget->toPlainText().endsWith("0")) 
    ) 
    { 
     qDebug() << "Integer entered"; 
    } 
    else 
    { 
     qDebug() << "Non-integer entered"; 
    } 
} 

然而,一種功能,當我打電話從on_plainTextEdit_textChanged()插槽這個功能,我得到一個錯誤:

undefined reference to validateText(QPlainTextEdit*) 

目前,我有這樣的代碼在框TextChanged插槽至今:

void Options::on_plainTextEdit_textChanged() 
{ 
    validateText(qobject_cast<QPlainTextEdit*>(qApp->widgetAt(180,30))); 
} 

正如你可以看到我想獲得對該對象本身的引用並將其傳遞給函數,但我遇到了這個問題。我做錯了什麼,或者有更容易的方式將一個小部件對象傳遞給Qt中的函數?

+0

我從來沒有使用'qobject_cast',但我懷疑它不適用於指針。你有嘗試過使用'static_cast'嗎? –

+0

另一種方法是使validateText函數成爲驗證器類的成員函數。驗證器類可以在其構造函數中獲取指向QPlainTextEdit的指針(並將該指針存儲在成員變量中),並設置信號和插槽的所有必要連接。 –

+0

是的,我嘗試'static_cast',但我仍然得到相同的錯誤 – Dohz

回答

3

好吧,正如丹尼爾在評論中所建議的那樣,我添加了一個驗證器類,並解決了我遇到的問題。這是未來任何人都有同樣問題的代碼。

validator.cpp

... 
Validator::Validator(QPlainTextEdit *textEdit) 
{ 
    this->myWidget = textEdit; 
} 
void Validator::validateText() 
{ 
    if ( (myWidget->toPlainText().endsWith("1")) || 
      (myWidget->toPlainText().endsWith("2")) || 
      (myWidget->toPlainText().endsWith("3")) || 
      (myWidget->toPlainText().endsWith("4")) || 
      (myWidget->toPlainText().endsWith("5")) || 
      (myWidget->toPlainText().endsWith("6")) || 
      (myWidget->toPlainText().endsWith("7")) || 
      (myWidget->toPlainText().endsWith("8")) || 
      (myWidget->toPlainText().endsWith("9")) || 
      (myWidget->toPlainText().endsWith("0")) 
     ) 
    { 
     qDebug() << "Integer entered"; 
    } 
    else 
    { 
     qDebug() << "Non-integer entered"; 
    } 
} 

而且函數調用

void Options::on_plainTextEdit_textChanged() 
{ 
    Validator* val = new Validator(ui->plainTextEdit); 
    val->validateText(); 
} 

這完全跳過需要從QWidget的轉換爲QPlainTextEdit或任何廢話。

+0

這可能有點晚,但您每次更改文本時都會創建一個新的Validator對象,並且您永遠不會銷燬它。不要讓它成爲指針,當它超出範圍時它會自動銷燬。或者在你的構造函數中動態創建它,所以它只會被創建一次。 – thuga