使用QPushButton将文本添加到QTextEdit

问题描述:

只需单击按钮即可将文本添加到textedit中的简单程序... 这里有什么不对吗?使用QPushButton将文本添加到QTextEdit


#include&ltQPushButton> 
#include&ltQApplication> 
#include&ltQTextEdit> 
#include&ltQWidget> 
#include&ltQHBoxLayout> 
#include&ltQLabel> 

int main(int argc,char *argv[]) 
{ 
QApplication app(argc,argv); 
QHBoxLayout *layout=new QHBoxLayout; 
QTextEdit *text = new QTextEdit(); 
QWidget window; 
QPushButton *button; 

layout->addWidget(text); 
button = new QPushButton(); 
button->setText(QChar(i+48)); 

QObject::connect(button,SIGNAL(clicked()),text,SLOT(setPlainText("hai"))); 

layout->addWidget(button); 
window.setLayout(layout); 
window.resize(500, 500); 
window.show(); 

return app.exec(); 
}

您不能像这样使用connect。您无法将参数传递给SLOT,而这些参数不存在于连接的SIGNAL中。

您需要将clicked()信号连接到自己的插槽(不带参数),并自己调用setPlainText函数(或发出具有QString参数一个新的信号)。

另一种选择是使用QSignalMapper,如Signals and Slots高级用法部分所述。

+0

你可以给我一个功能,使这件事情工作? – user767060 2011-06-05 12:28:35

+0

您需要创建一个真实的类(从QObject派生或者一个小部件)来处理您的自定义槽,或者阅读我为QSignalMapper方法指出的文档。所有这些在Qt文档,示例和教程中都有很好的描述。 – Mat 2011-06-05 12:30:53

+0

谢谢,信号映射器解决了!但它说它只是一个较慢的代码,告诉我是否有其他方法来实现它 – user767060 2011-06-05 18:27:55

我认为这是行不通的,你不能在connect声明中给出一个插槽默认参数。 SLOT宏实际上只是将其参数转换为字符串,并在text类的已注册插槽列表中搜索插槽名称。

你必须打电话给你自己的没有参数的插槽,并手动调用setPlainText与预期的文本。也许Qt在这方面有一些帮手类,但你的解决方案不应该工作。

顺便说一句,你真的试过这个,并得到一个错误,或者你只是在这里发布它,而不是简单地尝试一下吗?

+0

当使用滑块和线性编辑器时,任何一个对象的任何变化都会反映另一个对象,我直接在信号中使用valueChanged()函数将setValue()插入到插槽中。如果这样做,为什么不这样做,你可以简单地解释我如果可能? – user767060 2011-06-05 12:22:15

+0

我试过并制作了make文件并运行它。点击没有发生。而我刚刚刚开始使用Qt ....只是一个初学者.... – user767060 2011-06-05 12:27:57

+0

@ user767060因为您已将'valueChanged()'信号的值传送到'setValue()'插槽。但是这次你要求一个非参数信号将一个默认参数传送给该插槽,这只是不起作用。您可以在connect方法中从信号中删除参数,以便在调用插槽时丢弃信号的参数,但不能仅仅奇迹般地生成默认参数。唯一的方法就是声明槽(在类定义中)采用默认参数,但是当您更改QTextEdit的代码时,在这里不起作用。有关更多信息,请参阅Qt的信号/插槽文档 – 2011-06-05 12:29:06

您的信号和插槽不兼容。 Qt为此提供了doc。

尝试访问此page

在这里它说, “信号和插槽机制是类型安全的:信号的签名必须匹配接收插槽的签名(实际上插槽可能比它收到的信号更短的签名它可以忽略额外的参数)由于签名是兼容的,编译器可以帮助我们检测类型不匹配,信号和插槽是松耦合的:一个发出信号的类既不知道也不关心哪个插槽接收信号。信号插槽机制可以与函数调用进行比较(或归结为)。您正在发送信号的地方调用功能(插槽)。现在设想该函数需要一些参数,并且没有默认值。但是你正试图调用这个函数。会发生什么?。这就是你的代码中发生的事情。