2

我是一个 QT 初学者,我正在编写一个具有两个 QPushButtons 和两个 QTextEdits 的 GUI 应用程序。单击按钮 1 时,我只希望 QTextEdit 1 显示某些内容,单击按钮 2 时,我只希望 QTextEdit 2 显示某些内容,下面是我的代码,但它不起作用,因为我似乎无法将参数传递给槽法……

class EventProcessor: public QObject {

    Q_OBJECT

public slots:

    void PopulateEditTest(QTextEdit *textEdit, QString text)
    {
        textEdit->setText(text);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *window = new QWidget;

    QTextEdit *result1 = new QTextEdit();
    QTextEdit *result2 = new QTextEdit();
    QPushButton *btFacility1 = new QPushButton("Facility 1");
    QPushButton *btFacility2 = new QPushButton("Facility 2");

    EventProcessor eventprocessor;


    QObject::connect(btFacility1, SIGNAL(clicked()), &eventprocessor, SLOT(PopulateEditTest
                    (result1, "textEdit1")));
    QObject::connect(btFacility2, SIGNAL(clicked()), result, SLOT(PopulateEditTest
                    (result2, "textEdit2")));

    ..........


    return app.exec();
}

我想知道是否有类似的方法可以让这个工作?谢谢您的回答。

4

1 回答 1

1

您是正确的,因为您无法在调用时指定要传递给插槽的参数QObject::connect。您提供的只是函数定义,而不是函数调用。

完成你想要做的最简单的方法是在你的事件处理器类中添加几个槽:

class EventProcessor: public QObject {

    Q_OBJECT

public slots:

    void PopulateEditTest(QTextEdit *textEdit, QString text) { ...  }
    void button1Clicked() {
        PopulateEditTest(dynamic_cast<QTextEdit*>(sender()), "textEdit1");
    }

    void button2Clicked() {
        PopulateEditTest(dynamic_cast<QTextEdit*>(sender()), "textEdit1");
    }
};

...

QObject::connect(btFacility1, SIGNAL(clicked()), &eventprocessor, SLOT(button1clicked()));
QObject::connect(btFacility2, SIGNAL(clicked()), &eventprocessor, SLOT(button2Clicked()));

以这种方式使用该函数通常被认为是“邪恶”的原因有很多QObject::sender(),但它是完成你想要做的事情而不重写所有代码的最简单方法,这对我来说毫无意义在不知道你的长期目标是什么的情况下去做。

于 2013-08-02T03:29:49.903 回答