Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将loadFinished信号连接到自定义插槽时出现故障 我对QT、C++和信号和时隙都很陌生。我正在尝试加载一个网页。然后将标签3的文本设置为网页标题。为此,我想我必须将loadFinished信号连接到我的自定义函数。但我做这件事有困难_C++_Qt_Signals_Qtwebkit_Slot - Fatal编程技术网

将loadFinished信号连接到自定义插槽时出现故障 我对QT、C++和信号和时隙都很陌生。我正在尝试加载一个网页。然后将标签3的文本设置为网页标题。为此,我想我必须将loadFinished信号连接到我的自定义函数。但我做这件事有困难

将loadFinished信号连接到自定义插槽时出现故障 我对QT、C++和信号和时隙都很陌生。我正在尝试加载一个网页。然后将标签3的文本设置为网页标题。为此,我想我必须将loadFinished信号连接到我的自定义函数。但我做这件事有困难,c++,qt,signals,qtwebkit,slot,C++,Qt,Signals,Qtwebkit,Slot,我已经阅读了手册,不同的例子和其他问题,但我被卡住了。 这是我到目前为止的代码摘录 如何将信号loadFinished()正确连接到函数labelSetText() main.cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } mainwindow.cpp void MainWindow::on

我已经阅读了手册,不同的例子和其他问题,但我被卡住了。 这是我到目前为止的代码摘录

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

main.cpp

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

    return a.exec();
}
mainwindow.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);
}
主窗口

#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

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

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

connect(view, SIGNAL(loadFinished(bool)), ui->label_3, SLOT(setText(QString)));
请注意,由于
视图
已经是指向QObject的指针,因此您不应该让
连接(&view,…

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

connect(view, &QWebView::loadFinished, [=,this](){
  this->ui->label_3->setText(taxt);
});
lambda语法转换为一个函子类实例,其中包含
taxt
this
的副本作为成员。编译器基本上会动态创建以下内容:

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
成员添加到
main window
类中,并创建一个插槽来执行函子的操作。因此,对于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样式的连接,请将连接移动到主窗口的构造函数。对于Qt 5样式的连接,您需要在连接触发后断开连接

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));
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());
    ...
  }
};