2013-08-01 24 views
2

我是QT初学者,我正在编写一个GUI应用程序,它有两个QPushButtons和两个QTextEdits。当按钮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(); 
} 

我想知道是否有类似的方式来得到这个工作?谢谢您的回答。

回答

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()函数,但它是在不重写所有代码的情况下完成您尝试执行的操作的最简单方法,如果不知道您的长期目标是什么,那将毫无意义。

+0

嗨克里斯。谢谢您的回答。我试过你的代码,但它仍然不起作用。 “dynamic_cast (sender())”中的发件人是否指示发送信号的对象?在这个应用程序中,按钮? btFacility1或btFacility2? –

+0

是'sender()'返回发送信号的对象的QObject * – Chris

+0

谢谢,Chris。这非常有用......我可以用这种方式节省大量编码。 –