C++Qt:将TextEdit与Label连接起来

C++ Qt: Connect a TextEdit with a Label

本文关键字:Label 连接 起来 TextEdit C++Qt      更新时间:2023-10-16

在Qt GUI中,我试图将TextEdit与标签连接起来,这样当用户键入内容时,标签会更新其文本。以下是我尝试过的:

void MainWindow ::updatelabel()
{
    ui->label->setText("Hello");
}
void MainWindow::changeTextColor()
{
    QString textEdit = ui->textEdit->toPlainText();
    QString label = ui->label->text();
    connect(textEdit, SIGNAL(textChanged()), label, SLOT(updateLabel()));
}

这给了我一个错误:

error: no matching function for call to 'MainWindow::connect(QString&, const char*, QString&, const char*)'
     connect(textEdit, SIGNAL(textChanged()), label, SLOT(updateLabel()));
                                                                        ^

我做错了什么?我该如何解决?谢谢

您的代码中有一些问题。以下是更改后的代码,并附有说明:

// make sure updateLabel is declared under slots: tag in .h file
void MainWindow ::updatelabel()
{
    // set label text to be the text in the text edit when this slot is called
    ui->label->setText(ui->textEdit->toPlainText());
}
// this is a very suspicious method. Where do you call it from?
// I changed its name to better indicate what it does.
void MainWindow::initializeUpdatingLabel()
{
    //QString textEdit = ui->textEdit->toPlainText(); // not used
    //QString label = ui->label->text(); // not used
    // when ever textChanged is emitted, call our updatelabel slot
    connect(ui->textEdit, SIGNAL(textChanged()), 
            this, SLOT(updatelabel())); // updateLabel or updatelabel??!
}

一个实用提示:当您使用SIGNALSLOT宏时,请让Qt Creator自动完成它们。如果你手动键入它们,并拼写错误,你不会得到编译时错误,相反,会有一个关于没有匹配信号/插槽的运行时警告打印。

或者,假设您使用的是支持Qt5和C++11的编译器,您可以使用新的连接语法,如果您弄错了,它会给您带来编译器错误。首先将行CONFIG += C++11添加到.pro文件中,然后进行如下连接:

void MainWindow::initializeUpdatingLabel()
{
    connect(ui->textEdit, &QTextEdit::textChanged, 
            this, &MainWindow::updatelabel);
}

现在,如果您实际上并没有updateLabel方法,就会出现编译时错误,这比您可能根本没有注意到的运行时消息要好得多。您也可以用lambda替换整个updatelabel方法,但这超出了这个问题/答案的范围。

您在该方法中连接到错误的textEditlabel变量:

-    connect(textEdit, SIGNAL(textChanged()), label, SLOT(updateLabel()));
+    connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(updateLabel()));

QString不是具有信号和插槽的小部件。您需要uiui->textEditthis中包含updateLabel()的当前类的实际小部件。

编辑:修正我犯的错误,因为我在疲劳时回答。