connect() 找不到信号函数
connect() can't find signal function
我正在尝试这样设置 connect()
:
QObject::connect(&webControl,
SIGNAL(Ui::MainWindow::loadFinished(bool)),
&w,
SLOT(Ui::MainWindow::loadFinished(bool)));
在 main()
函数中,但它给出了错误:
QObject::connect: No such signal
QWebView::Ui::MainWindow::loadFinished(bool)
w
和 webControl
声明如下:
MainWindow w;
QWebView webControl;
这是我的文件:
mainWindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void loadFinished(bool arg1);
private:
Ui::MainWindow *ui;
};
mainWindow.cpp
void MainWindow::loadFinished(bool arg1)
{
}
为什么我会收到这个错误,我该如何解决?
我建议使用新的 Qt5 语法(可选):
QObject::connect(&webControl, &Ui::MainWindow::loadFinished,
&w, &Ui::MainWindow::loadFinished);
关于新语法的更多信息:http://wiki.qt.io/New_Signal_Slot_Syntax
您需要将 QWebView *webView;
添加到您的 mainwindow.h
:
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QWebView *getWebView() const;
public slots:
void loadFinished(bool arg1);
void setWebView(QWebView *webControl);
private:
Ui::MainWindow *ui;
QWebView *webView;
};
mainwindow.cpp
...
QWebView *MainWindow::getWebView() const
{
return webView;
}
void MainWindow::setWebView(QWebView *webControl)
{
webView = webControl;
QObject::connect(webControl,
SIGNAL(loadFinished(bool)),
this,
SLOT(loadFinished(bool)));
}
如果您确实需要在 main.cpp
中声明 QWebView
,则将指针传递给 setWebView()
函数:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QWebView webControl;
w.setWebView(&webControl);
w.show();
return a.exec();
}
你的问题是 QWebView webControl;
webcontrol 是一个 qwebview 而你的信号不在 QWebview 中,而是在 MainWindow 中。您需要在 QWebView 中使用该信号。这就是为什么它抱怨找不到信号的原因。
编辑
你不知道什么是插槽,什么是信号。你是两个不同的东西。信号就像警报。插槽是接收器,它作为正常功能工作。
如果你想让你的 webControl 变量成为发送者,那么你必须在你的 QWebView.h class :
中像这样声明信号
signals:
void yourSignalName(bool arg1);
并像这样使用连接:
QObject::connect(&webControl,
SIGNAL(yourSignalName(bool)),
&w,
SLOT(loadFinished(bool)));
我正在尝试这样设置 connect()
:
QObject::connect(&webControl,
SIGNAL(Ui::MainWindow::loadFinished(bool)),
&w,
SLOT(Ui::MainWindow::loadFinished(bool)));
在 main()
函数中,但它给出了错误:
QObject::connect: No such signal QWebView::Ui::MainWindow::loadFinished(bool)
w
和 webControl
声明如下:
MainWindow w;
QWebView webControl;
这是我的文件:
mainWindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void loadFinished(bool arg1);
private:
Ui::MainWindow *ui;
};
mainWindow.cpp
void MainWindow::loadFinished(bool arg1)
{
}
为什么我会收到这个错误,我该如何解决?
我建议使用新的 Qt5 语法(可选):
QObject::connect(&webControl, &Ui::MainWindow::loadFinished,
&w, &Ui::MainWindow::loadFinished);
关于新语法的更多信息:http://wiki.qt.io/New_Signal_Slot_Syntax
您需要将 QWebView *webView;
添加到您的 mainwindow.h
:
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QWebView *getWebView() const;
public slots:
void loadFinished(bool arg1);
void setWebView(QWebView *webControl);
private:
Ui::MainWindow *ui;
QWebView *webView;
};
mainwindow.cpp
...
QWebView *MainWindow::getWebView() const
{
return webView;
}
void MainWindow::setWebView(QWebView *webControl)
{
webView = webControl;
QObject::connect(webControl,
SIGNAL(loadFinished(bool)),
this,
SLOT(loadFinished(bool)));
}
如果您确实需要在 main.cpp
中声明 QWebView
,则将指针传递给 setWebView()
函数:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QWebView webControl;
w.setWebView(&webControl);
w.show();
return a.exec();
}
你的问题是 QWebView webControl;
webcontrol 是一个 qwebview 而你的信号不在 QWebview 中,而是在 MainWindow 中。您需要在 QWebView 中使用该信号。这就是为什么它抱怨找不到信号的原因。
编辑
你不知道什么是插槽,什么是信号。你是两个不同的东西。信号就像警报。插槽是接收器,它作为正常功能工作。
如果你想让你的 webControl 变量成为发送者,那么你必须在你的 QWebView.h class :
中像这样声明信号signals:
void yourSignalName(bool arg1);
并像这样使用连接:
QObject::connect(&webControl,
SIGNAL(yourSignalName(bool)),
&w,
SLOT(loadFinished(bool)));