【问题标题】:Trouble connecting loadFinished SIGNAL to custom SLOT将 loadFinished SIGNAL 连接到自定义 SLOT 时出现问题
【发布时间】:2014-02-07 23:13:04
【问题描述】:

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

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

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

main.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)));
                                             ^

【问题讨论】:

    标签: c++ qt signals qtwebkit slot


    【解决方案1】:

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

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

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

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

    注意你不应该有connect(&amp;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 风格的连接,您需要在连接触发后断开连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多