C2065:" ui" :未声明的标识符

时间:2015-07-07 15:51:55

标签: c++ qt

我在Qt Designer中编写了我的第一个程序,而且我将QLineEdit文本更改为空的问题。我想用这个操作分离线程,所以我可以继续在程序的另一部分工作,而无需等待Sleep(5000)函数的结束。但是当我想编译这段代码时,我得到了3个错误:

  

C2065:" ui" :未声明的标识符

     

C2227:left" - > AutoWyl_textPotwierdzenie"必须指向类型class / struct / union / generic

     

C2227:左" - > setText"必须指向类型class / struct / union / generic

你能帮我解决这些错误吗?提前谢谢。

这是代码中有问题的部分:

    {...   
        void autowyl_potwierdzenie_reset();
        std::thread reset(autowyl_potwierdzenie_reset);
        reset.detach();
    }

    void autowyl_potwierdzenie_reset()
    {
        Sleep(5000);
        ui->Autowyl_textPotwierdzenie->setText(""); //3 errors
    }

2 个答案:

答案 0 :(得分:3)

好像你忘了将你的方法范围扩展到类ui是其成员。

这样的事情应该有效:

void MainWindow::autowyl_potwierdzenie_reset()
{
    Sleep(5000);
    ui->Autowyl_textPotwierdzenie->setText("");
}

MainWindow是包含ui的类。

一个更完整的例子,编译,可以帮助你更快地得到答案。

这可能是有意义的:Why does C++ need the scope resolution operator?

答案 1 :(得分:1)

我认为你是从包含ui的类的方法创建线程的(这可能是指向Ui::TheWidgetYouDesignedInQtDesigner的指针)。另一方面,线程运行的函数不在类中,因此无法到达ui

我建议将ui作为参数传递,或者更好的是,只传递QLineEdit

// ...
std::thread reset(autowyl_potwierdzenie_reset, ui-> Autowyl_textPotwierdzenie);
// ...

void autowyl_potwierdzenie_reset(QLineEdit* lineEdit)
{
    Sleep(5000);
    lineEdit->setText("");
}

如果再次使用autowyl_potwierdzenie_reset,则可以使用lambda函数(增加代码的可读性):

std::thread reset([ui]() {
  Sleep(5000);
  ui->Autowyl_textPotwierdzenie->setText("");
});
reset.detach();