使用两个不同的类在Qt中连接
connect in qt using two different classes
我想连接来自两个不同类的信号和一个插槽,其中一个使用另一个,如以下示例所示:
表单.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);
}
我知道这很容易解决,但我不知道该怎么做。connect
Form::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
,除非你MainWindow
Form
的父级,然后调用parent()
函数通过指针访问MainWindow
。但这是一种疯狂且气馁的编程实践,因为Form
一定不知道MainWindow
的存在。
尽管Qt5仍然支持Qt4风格的connect()
(使用SIGNAL
和SLOT
宏),但它已被弃用,可能会在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 信号和插槽
相关文章:
- QT 连接没有要调用的匹配功能
- QT - 连接 Qml 按钮 单击到 Cpp 构造函数
- 一个 ui 成员的 Qt 连接和同一连接中的两个信号
- Qt 连接无法识别 lambda 表达式
- Qt/C++ 连接到经典蓝牙设备
- QT连接:使用lambda表达式重置通过了int变量(怪异)
- QT连接到按钮不起作用
- Qt连接到插槽辅助接口
- Qt-连接触发动作中的信号/插槽
- QT连接在构造函数中不连接
- 窗口处于全屏模式时,QT连接不起作用
- 类之间的 QT 连接
- 无法为 QT 连接函数提供参数
- 如何将基本的qt连接转换为while循环
- Qt连接不同窗口中的类
- 如何使用Qt连接函数调用Shell Execute
- Qt 连接无法连接到插槽
- Qt:连接信号和插槽
- 使用 Qt 连接到本地数据库
- Qt连接不起作用