我是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();
}
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);
}
mainwindow.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)));
^
答案 0 :(得分:3)
这不是连接的工作方式。信号槽连接只能将信号中的数据传递到插槽中。它不能像你那样传递任意变量。您可以编写connect语句的唯一方法如下(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语法转换为一个仿函数类实例,其中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
成员添加到你的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样式连接,您需要在连接时断开连接。