gpt4 book ai didi

c++ - 无法将 loadFinished SIGNAL 连接到自定义 SLOT

转载 作者:行者123 更新时间:2023-11-30 02:49:00 25 4
gpt4 key购买 nike

我是 Qt、C++ 以及信号和槽的新手。我正在尝试加载网页。然后将label_3的文本设置为网页的标题。为此,我想我必须将 loadFinished 信号连接到我的自定义函数。但我很难做到这一点。

我已经阅读了手册、不同的示例和其他问题,但我被卡住了。这是我目前拥有的代码的摘录。

如何将信号 loadFinished() 正确连接到我的函数 labelSetText()?

主要.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

主窗口.cpp

void MainWindow::on_pushButton_clicked()
{
QString webAdress = ui->lineEdit->text();

QWebView *view = ui->webView;
view->load(QUrl(webAdress));

QString taxt = view->title();

connect(&view, SIGNAL(loadFinished(bool)),
this, SLOT(labelSetText(taxt)));

QWebPage * webPage = view->page();
}

void MainWindow::labelSetText(QString titleStr)
{
ui->label_3->setText(titleStr);
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QWidget
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_pushButton_clicked();
void labelSetText(QString titleStr);

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

编辑:这是我得到的错误

E:\_Programming\C++\playAround\mainwindow.cpp:37: error: no matching function for call to 'MainWindow::connect(QWebView**, const char*, MainWindow* const, const char*)'
this, SLOT(labelSetText(taxt)));
^

最佳答案

这不是连接的工作方式。信号槽连接只能将信号中的数据传递到槽中。它不能像你一样传递任意变量。编写连接语句的唯一方法如下(不需要 this 参数):

connect(view, SIGNAL(loadFinished(bool)), SLOT(labelSetText(QString)));

这当然不行,因为信号和槽是不兼容的。你当然不需要中间槽,因为标签已经有你想要的槽,但这没有帮助:

connect(view, SIGNAL(loadFinished(bool)), ui->label_3, SLOT(setText(QString)));

请注意,您不应该使用 connect(&view, ...,因为 view 已经是一个指向 QObject 的指针。

为此,您需要利用 C++11:

connect(view, &QWebView::loadFinished, [=,this](){
this->ui->label_3->setText(taxt);
});

lambda 语法转换为仿函数类实例,其中包含 taxtthis 的拷贝作为成员。编译器基本上会即时创建以下内容:

class Functor_1 {
MainWindow * _this;
QString taxt;
public:
MyFunctor_1(MainWindow * a1, const QString & a2) : _this(a1), taxt(a2) {}
void operator() {
_this->ui->label_3->setText(taxt);
}
}

...
connect(view, &QWebView::loadFinished, Functor_1(this, taxt));

当然这意味着如果你想使用 Qt 4 信号和槽,你需要将 taxt 成员添加到你的 MainWindow 类中,并创建一个槽来做仿函数做的事。所以,对于 Qt 4:

class MainWindow : public QMainWindow {
Q_OBJECT
QString m_taxt;
Q_SLOT void loadFinished() {
ui->label_3->setText(m_taxt);
}
...
Q_SLOT void on_pushButton_clicked() {
QString webAdress = ui->lineEdit->text();

QWebView *view = ui->webView;
view->load(QUrl(webAdress));
m_taxt = view->title();

connect(view, SIGNAL(loadFinished(bool)), SLOT(loadFinished());
...
}
};

请注意,您不应重复连接。对于 Qt 4 样式连接,将连接移动到 MainWindow 的构造函数。对于 Qt 5 样式的连接,您需要在它触发后断开连接。

关于c++ - 无法将 loadFinished SIGNAL 连接到自定义 SLOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com