使用两个不同的类在qt中进行连接

时间:2018-07-12 15:11:47

标签: c++ qt qt5

我想连接两个不同类的信号和插槽,其中一个正在使用另一类,例如本例:

form.hpp

class Form : public QDialog
{
    Q_OBJECT

public:
    explicit Form();
public slots:
     void onPushButton(void);    

};

form.cpp

Form::Form() :
    QDialog(parent)
{
    ui->setupUi(this);
    connect(..., SIGNAL(clicked()),..., SLOT(onPushButton()));

}

void Form::onPushButton(void)
{
    ui->pushButton->setText(QString("clicked"));
}

mainwindow.hpp

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

private:
    Ui::MainWindow *ui;
    Form f;
};

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

我知道它很容易解决,但我不知道该怎么做。 connectForm::Form()的语法是什么? 如果是这样,我会那样做:

connect(&f, SIGNAL(clicked()),this, SLOT(onPushButton()));

2 个答案:

答案 0 :(得分:1)

必须在MainWindow构造函数中进行连接,但是必须使用lambda方法,因为信号不会将文本传递给它。

form.h

class Form : public QDialog
{
    Q_OBJECT

public:
    explicit Form();
public slots:
     void processingFunction(const QString & text);    

};

form.cpp

Form::Form() :
    QDialog(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

}

void Form::processingFunction(const QString & text)
{
    // some processing
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked, [this](){
        f.processingFunction(ui->lineEdit->text());
    });
}

答案 1 :(得分:0)

[UPDATE] Form 不会发出clicked信号。您应该连接QPushButton(或类似名称)而不是类Form。否则,您应该在类中声明信号clicked(),并在代码中的某处emit声明:

class Form : public QDialog
{
    Q_OBJECT

public:
    explicit Form();

signals:
    void clicked();

public slots:
     void onPushButton(void);
};

void Form::someFunction(/* parameters */)
{
    emit clicked();
}

此外,如果您想建立最后提到的连接,则应在MainWindow类中进行连接,因为您不能从MainWindow访问Form,除非您将MainWindow设为Form的父级,然后调用parent()函数以通过指针访问MainWindow。但这是一种疯狂而沮丧的编程习惯,因为Form必须知道MainWindow的存在。

尽管Qt5仍支持Qt4样式的connect()(使用SIGNALSLOT宏),但已弃用它,并且可能会在2019年将其从Qt6中删除,因此您必须切换到Qt5风格的connect()

QObject::connect(lineEdit, &QLineEdit::textChanged,
                   label,  &QLabel::setText);

这有几个优点:

  • 可以在编译时而不是在执行时引发错误。
  • 可以使用
  • C ++ 11 Lambda。

看到这个:

connect(sender, &QPushButton::clicked, [=]() {
    // Code here. Do whatever you want.
});
  • 解决起来快很多。

看看:Qt5 Signals and Slots