我想连接两个不同类的信号和插槽,其中一个正在使用另一类,例如本例:
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);
}
我知道它很容易解决,但我不知道该怎么做。 connect
中Form::Form()
的语法是什么?
如果是这样,我会那样做:
connect(&f, SIGNAL(clicked()),this, SLOT(onPushButton()));
答案 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()
(使用SIGNAL
和SLOT
宏),但已弃用它,并且可能会在2019年将其从Qt6中删除,因此您必须切换到Qt5风格的connect()
:
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);
这有几个优点:
看到这个:
connect(sender, &QPushButton::clicked, [=]() {
// Code here. Do whatever you want.
});