1

我对 Qt 很陌生。

我想回复linkClickedin QWebView

我试过这样连接:

QObject::connect(ui->webView, SIGNAL(linkClicked(QUrl)),
                 MainWindow,SLOT(linkClicked(QUrl)));

但我收到错误:C:/Documents and Settings/irfan/My Documents/browser1/mainwindow.cpp:9: error: expected primary-expression before ',' token

当我使用 UI 编辑信号槽执行此操作时:

我在插槽的头文件声明中:

void linkClicked(QUrl &url);

在源 cpp 文件中:

void MainWindow::linkClicked(QUrl &url)
{
   QMessageBox b;
   b.setText(url->toString());
   b.exec();
}

当我运行它时,它会编译并运行,但会收到警告:

Object::connect: No such slot MainWindow::linkClicked(QUrl) 
  in ui_mainwindow.h:100

进行此事件处理的正确方法是什么?

4

3 回答 3

2

您声明它现在可以工作,因为您更改QObject::connectconnect. 现在我不是 100% 对此,但我相信这样做的原因是通过调用connect,您正在调用与作为应用程序一部分的对象关联的方法。即这就像在做this->connect(...)。这样,它与现有对象相关联 - 而不是调用QObject::connect对您的应用程序一无所知的静态方法。

抱歉,如果不清楚,希望我能明白这一点!

于 2009-05-11T09:18:58.103 回答
2

在这种情况下使用 QObject::connect() 和 connect() 是相同的。我相信

QObject::connect(ui->webView,SIGNAL(linkClicked(QUrl)),
                 MainWindow,SLOT(linkClicked(QUrl)));

是从 MainWindow 类中的函数调用的。这就是为什么当你尝试

connect(ui->webView,SIGNAL(linkClicked(const QUrl)),
        this,SLOT(linkClicked(const QUrl)),Qt::DirectConnection);

有用。注意使它起作用的区别-第三个参数。您在第二个片段中使用了它,就像您在第一个片段中使用MainWindow一样

阅读本文以了解信号和插槽机制的工作原理以及如何正确实现它。

于 2009-05-11T10:43:39.913 回答
1

我改为QObject::connectconnect,它有效。

所以这段代码有效:

connect(ui->webView,SIGNAL(linkClicked(const QUrl)),this,SLOT(linkClicked(const QUrl)),Qt::DirectConnection);

但我不知道为什么?

于 2009-05-11T08:22:24.077 回答