2013-04-11 115 views
0

我的GUI由LineEditPushButton组成。当点击PushButton时,槽位clicked()被调用。我想设置一个clicked()作为信号和doSomething()作为插槽之间的信号槽关系。问题是doSomething()无法访问UI,doSomething()依赖于LineEdit的文本正常工作。如何通过信号和插槽传递参数?

我看到两个解决方案:

  1. 格兰特DoSomething的()获取UI。

  2. 我想能够通过一个QString doSomething()作为参数。 clicked()不接受任何参数。 Qsignalmapper可能是我正在寻找的。但是,似乎映射器只根据信号是什么传递参数。因此,论据需要事先进行设置,似乎在这里没有帮助。

我该怎么办解决方案2?

回答

1

假设一个C++溶液,则可以考虑使用像#2以下的中间信号:

connect(thisWidget, SIGNAL(clicked()), 
     thisWidget, SLOT(slotClickHandler())); 

然后:

void slotClickHandler() 
{ 
    QString s = "my variable string here"; 

    emit sigDoSomething(s); 
} 

和它们:

void slotDoSomething(const QString &s) 
{ 
    // Do something interesting with s here 

} 

注这段代码假设你已经定义了一个新的信号sigDoSomething(const QString &)和一个专用插槽void slotDoSomething(const QString &)

+0

太棒了!你会说哪个更清洁?方法1或方法2?这取决于,对吗?方法2的问题在于复制信号/插槽的数量在处理很多GUI元素时会变得混乱,对吗?另外,为什么它是const QString&s?它不应该只是QString? – user2268490 2013-04-11 02:48:49

+0

正如你所说,这是“更清洁”的依赖。清洁剂是什么意思?更容易阅读?更容易调试?编译器更容易?开发人员通常是最薄弱的环节,因此偏见“更清洁”。将信号和插槽清楚地映射到它们各自的小部件(使用有意义的名称等)。让QT moc和gcc担心电话的数量。无论如何,简单的链接函数调用可能会进行优化。最后,看似重复的呼叫将取决于您的实施:有多少个按钮?他们究竟需要传达什么>?等。 – Throwback1986 2013-04-11 03:09:08

+0

至于const QString&,我假设插槽实现不需要修改QString。如果是这样,通过值传递(即QString s)将会生成QString对象的不需要的副本。另一方面,通过引用传递QString(QString&)允许编译器传递更高效的引用(本质上是指向对象的指针)。添加const限定符可以确保编译器知道QString不会被修改。 (事实上​​,如果你试图修改一个const对象,编译器会声明一个错误)。 – Throwback1986 2013-04-11 03:14:43