不同 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
    ...
}

希望对您有所帮助 ;)