Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QPushButton将文本添加到QTextEdit_C++_Qt_Qt4 - Fatal编程技术网

C++ 使用QPushButton将文本添加到QTextEdit

C++ 使用QPushButton将文本添加到QTextEdit,c++,qt,qt4,C++,Qt,Qt4,只是一个简单的程序,添加文本编辑按钮时,点击文本。。。 这里有什么问题吗 #include<QPushButton> #include<QApplication> #include<QTextEdit> #include<QWidget> #include<QHBoxLayout> #include<QLabel> int main(int argc,char *argv[]) { QApplication app(argc,argv); QHBoxLayout *l

只是一个简单的程序,添加文本编辑按钮时,点击文本。。。 这里有什么问题吗


#include<QPushButton>
#include<QApplication>
#include<QTextEdit>
#include<QWidget>
#include<QHBoxLayout>
#include<QLabel>

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
。您不能将连接的
信号
中不存在的参数传递到
插槽

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


另一个选项是使用,如高级用法部分所述。

我认为这不起作用,您不能在
connect
语句中为插槽指定默认参数。
SLOT
宏实际上只是将其参数转换为字符串,并在
text
类的已注册插槽列表中搜索插槽名称

您必须调用自己的插槽,该插槽不带任何参数,并使用预期文本手动调用
setPlainText
。也许Qt在这个方向上有一些助手类,但您的解决方案不应该起作用


顺便问一下,您是否真的尝试了这个方法并出现了错误,或者您只是在这里发布了它,而没有进行简单的尝试?

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

试试看这个

这里面说,, “信号和插槽机制是类型安全的:信号的签名必须与接收插槽的签名匹配。(事实上,插槽的签名可能比它接收的信号短,因为它可以忽略额外的参数。)由于签名是兼容的,编译器可以帮助我们检测类型不匹配。信号和插槽是松散耦合的:发出信号的类既不知道也不关心哪些插槽接收信号。”


信号槽机制可以与函数调用相比较(或归结为函数调用)。您正在发出信号的位置调用函数(插槽)。现在假设函数需要一些参数,并且没有默认值。但是您正在尝试调用该函数。会发生什么?。这就是代码中发生的情况。

当使用滑块和lineedit时,其中任何一个对象中的任何更改都会反映另一个对象,我直接在插槽中的signal to setValue()中使用valueChanged()。如果这样做有效,为什么不这样做呢?如果可能的话,你能简单地解释一下吗???我试着制作了make文件并运行了它。单击时,什么也没发生。我今天刚开始使用Qt。。。。只是一个初学者…@user767060,因为您将值从
valueChanged()
信号传输到
setValue()
插槽。但这一次,您要求一个非参数信号将默认参数传输到插槽,这根本不起作用。您可以在connect方法中删除信号中的参数,以便在调用插槽时丢弃信号的参数,但您不能神奇地生成默认参数。唯一的方法是声明slot(在类定义中)接受一个默认参数,但是当您更改QTextEdit的代码时,这在这里不起作用。有关更多信息,请参阅Qt的信号/插槽文档info@user767060如果您是这样一个初学者,我建议您阅读一些有关Qt基础知识的介绍性材料。否则,您对Qt做出了一个很好的选择。@user767060它工作正常但什么也没有发生的原因是,错误的连接调用通常不是编译器错误,而只是一个小的运行时错误,Qt会忽略它(它会将错误打印到stdout),因此信号只是没有连接到插槽。您需要创建一个真正的类(源自QObject或小部件)处理您的自定义插槽,或者阅读我为QSignalMapper方法指出的文档。所有这些在Qt文档、示例和教程中都有很好的描述。谢谢,信号映射器工作了!!!但它说它是较低的代码,请告诉我您是否有任何其他方法来实现它。不要担心信号/插槽的代码较慢。使用信号映射你可能只是增加了一些函数调用的开销。除非你有一个巨大的映射和每秒数百个信号,否则你不会注意到任何事情。