【问题标题】:How to pass a widget object to a function in Qt?如何将小部件对象传递给 Qt 中的函数?
【发布时间】:2012-12-27 15:38:23
【问题描述】:

我对 Qt 相当陌生,如果有人能帮助我解决这个问题,我将不胜感激。 我正在使用 Qt Creator 并创建了一个带有 PlainTextEdit 的表单。我正在尝试使用 if 语句来验证在此文本框中输入的文本。我做了一个如下的函数

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 中的函数?

【问题讨论】:

  • 我从未使用过qobject_cast,但我怀疑它不是用于指针。您是否尝试过改用static_cast
  • 另一种方法是让您的 validateText 函数成为验证器类的成员函数。验证器类可以在其构造函数中获取指向 QPlainTextEdit 的指针(并将此指针存储在成员变量中)并设置所有必要的信号和插槽连接。
  • 是的,我确实尝试过static_cast,但我仍然遇到同样的错误
  • 嗯,添加验证器类听起来是一个更好的选择。我要试一试。感谢您的评论丹尼尔。
  • 如果您解决了您的问题,请将其作为答案。允许并鼓励您这样做。一旦某个时间结束,您可以简单地接受它。然后我们有一个问题和答案。毕竟这是一个问答。 ;)

标签: c++ qt function object reference


【解决方案1】:

好的,正如 Daniel 在 cmets 中所建议的,我添加了一个验证器类并解决了我遇到的问题。这是以后遇到同样问题的任何人的代码。

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 或任何废话的需要。

【讨论】:

  • 这可能有点晚了,但是每次更改文本时您都会创建一个新的Validator 对象,并且您永远不会破坏它。不要让它成为一个指针,它会在超出范围时自动销毁。或者在你的构造函数中动态创建它,所以它只会被创建一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2011-01-09
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多