初学QT,在尝试用connect手动关联一个按钮和QlineEdit的时候编译报错,如下:
?然后贴上主要代码块:
//以下是mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void self_pushButton_clicked();
};
#endif // MAINWINDOW_H
//以下是mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPushButton>
#include<QLineEdit>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->myline->setText("hello");
ui->mybtn->setText("clicked me");
connect(ui->mybtn,&QPushButton::clicked,ui->myline,&MainWindow::self_pushButton_clicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::self_pushButton_clicked()
{
ui->myline->setText("你好");
}
?ui长这样:
上网查了查,这种错误叫重载不匹配(好像叫这个名),于是我找了半天没找到哪里不匹配,期间去问了某个大佬学长结果学长也没看出来,总之经过两天的折磨之后被迫重新从自定义信号和槽去学,才注意到这样的一条规则
connect(发送信号的类,&信号函数,接收信号的类,&槽函数);[QT5]
?期中信号函数一般是发送信号类的成员函数,而槽函数一般是接收信号的类的成员函数;(槽函数也可以是全局函数)
再来看原来程序里的connect:
connect(ui>mybtn,&QPushButton::clicked,ui>myline,&MainWindow::self_pushButton_clicked);
这里myline是ui里引入的一个QlineEdit类。
所以问题就很明白了!
因为self_pushButton_clicked()不是QlineEdit的成员函数,所以自然是不匹配的,它是MainWindow的成员函数,所以这句话的正确表述是:
connect(ui>mybtn,&QPushButton::clicked,this,&MainWindow::self_pushButton_clicked);
没错这个S*B错误困扰了我两天充分证明了我也是S*B
以上
(小白第一次发博客,写的不对还请包容指出,谢谢)
|