使用两个不同的类在Qt中连接

connect in qt using two different classes

本文关键字:Qt 连接 两个      更新时间:2023-10-16

我想连接来自两个不同类的信号和一个插槽,其中一个使用另一个,如以下示例所示:

表单.hpp

class Form : public QDialog
{
Q_OBJECT
public:
explicit Form();
public slots:
void onPushButton(void);    
};

形式.cpp

Form::Form() :
QDialog(parent)
{
ui->setupUi(this);
connect(..., SIGNAL(clicked()),..., SLOT(onPushButton()));
}
void Form::onPushButton(void)
{
ui->pushButton->setText(QString("clicked"));
}

主窗口.hpp

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private:
Ui::MainWindow *ui;
Form f;
};

主窗口.cpp

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

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

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

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

表格.h

class Form : public QDialog
{
Q_OBJECT
public:
explicit Form();
public slots:
void processingFunction(const QString & text);    
};

形式.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());
});
}

[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类中这样做,因为你不能从Form访问MainWindow,除非你MainWindowForm的父级,然后调用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 信号和插槽