不同 class 中的 QT 信号和插槽
QT Signals & slots in diffrent class
我的程序有 2 个 类。其中之一是 MainWindow,另一个是 Calc。
在 main window 中,我使用自动生成的函数 on_PushButton_clicked。此函数应发送两个值:double 和 char 以在 Calc 中运行。
第一个:
void MainWindow::on_OneButton_clicked(){
QObject::connect(ui->ZeroButton , SIGNAL(clicked()), this, SLOT(...)) );
ui->TextEdit->insertPlainText("1");
}
秒:
void Calc::Add(double val, char oper){
//compute something
}
这是我第一个使用 Qt 的应用程序,我不知道如何连接它们。我在这个论坛上搜索过类似的问题,但找不到。
对不起,如果我错了。
首先,你要清楚signal/slot机制是什么,你在做什么。
Signal/slot 机制是一个 Qt 概念,link 一个函数(信号)到另一个函数(槽)。要在信号和槽之间 "make a link",您必须使用 QObject::connect(...) 连接它们。
当您在 Qt 设计器中使用自动生成的函数 on_PushButton_Clicked() 时,实际上,您 "make a link" 在单击按钮时发出的信号 clicked() 之间,有一个插槽 on_PushButton_Clicked()。然而,这个信号和这个插槽之间的连接没有出现在你的代码中,所以它可能会让人感到困惑,这就是我指出它的原因。
当你这样写的时候:
void MainWindow::on_OneButton_clicked(){
QObject::connect(ui->ZeroButton , SIGNAL(clicked()), this, SLOT(...)) );
ui->TextEdit->insertPlainText("1");
}
每次单击按钮时,您都会在单击时创建与 zeroButton 的连接和插槽。由于连接在 object 被破坏之前有效,如果您再次点击您的按钮,您将在单击时在 zeroButton 和您的插槽之间建立第二个连接。
创建连接的更好方法是在创建 object(在您的情况下为 mainWindow)时使用 connect(...) 函数。
为了简化您的计算器,您可以创建 9 个数字按钮、4 个运算符按钮和 1 个用于计算所有内容的按钮。
在你的主窗口构造函数中,你可以有类似的东西:
connect(ui->pushButton1, SIGNAL(clicked()), this, SLOT(onPushButton1Clicked()));
.... // Every other signal for each button
connect(ui->pushButtonEqual, SIGNAL(clicked(), this, SLOT(onPushButtonEqualClicked());
在你的 body
void MainWindow::onPushButton1Clicked()
{
// concatenate current value + 1
ui->textEdit->insertPlainText(ui->textEdit->toPlainText() + "1");
}
void MainWindow::onPushButtonEqualClicked()
{
// check textedit content (need a digit + operator + digit)
...
// compute result
...
// write result in TextEdit
...
}
希望对您有所帮助 ;)
我的程序有 2 个 类。其中之一是 MainWindow,另一个是 Calc。 在 main window 中,我使用自动生成的函数 on_PushButton_clicked。此函数应发送两个值:double 和 char 以在 Calc 中运行。
第一个:
void MainWindow::on_OneButton_clicked(){
QObject::connect(ui->ZeroButton , SIGNAL(clicked()), this, SLOT(...)) );
ui->TextEdit->insertPlainText("1");
}
秒:
void Calc::Add(double val, char oper){
//compute something
}
这是我第一个使用 Qt 的应用程序,我不知道如何连接它们。我在这个论坛上搜索过类似的问题,但找不到。 对不起,如果我错了。
首先,你要清楚signal/slot机制是什么,你在做什么。
Signal/slot 机制是一个 Qt 概念,link 一个函数(信号)到另一个函数(槽)。要在信号和槽之间 "make a link",您必须使用 QObject::connect(...) 连接它们。
当您在 Qt 设计器中使用自动生成的函数 on_PushButton_Clicked() 时,实际上,您 "make a link" 在单击按钮时发出的信号 clicked() 之间,有一个插槽 on_PushButton_Clicked()。然而,这个信号和这个插槽之间的连接没有出现在你的代码中,所以它可能会让人感到困惑,这就是我指出它的原因。
当你这样写的时候:
void MainWindow::on_OneButton_clicked(){
QObject::connect(ui->ZeroButton , SIGNAL(clicked()), this, SLOT(...)) );
ui->TextEdit->insertPlainText("1");
}
每次单击按钮时,您都会在单击时创建与 zeroButton 的连接和插槽。由于连接在 object 被破坏之前有效,如果您再次点击您的按钮,您将在单击时在 zeroButton 和您的插槽之间建立第二个连接。
创建连接的更好方法是在创建 object(在您的情况下为 mainWindow)时使用 connect(...) 函数。
为了简化您的计算器,您可以创建 9 个数字按钮、4 个运算符按钮和 1 个用于计算所有内容的按钮。
在你的主窗口构造函数中,你可以有类似的东西:
connect(ui->pushButton1, SIGNAL(clicked()), this, SLOT(onPushButton1Clicked()));
.... // Every other signal for each button
connect(ui->pushButtonEqual, SIGNAL(clicked(), this, SLOT(onPushButtonEqualClicked());
在你的 body
void MainWindow::onPushButton1Clicked()
{
// concatenate current value + 1
ui->textEdit->insertPlainText(ui->textEdit->toPlainText() + "1");
}
void MainWindow::onPushButtonEqualClicked()
{
// check textedit content (need a digit + operator + digit)
...
// compute result
...
// write result in TextEdit
...
}
希望对您有所帮助 ;)