【问题标题】:Add text to QTextEdit using QPushButton使用 QPushButton 将文本添加到 QTextEdit
【发布时间】:2011-06-05 20:33:11
【问题描述】:

只是一个简单的程序,可以在单击按钮时将文本添加到 textedit... 这里有什么问题吗??


#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();
}

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    你不能这样使用connect。您不能将不存在于连接的SIGNAL 中的参数传递给SLOT

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

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

    【讨论】:

    • 您需要创建一个真正的类(从 QObject 或小部件派生)来处理您的自定义插槽,或者阅读我为 QSignalMapper 方法指出的文档。所有这些都在 Qt 文档、示例和教程中得到了很好的描述。
    • 谢谢,信号映射器成功了!!!但它说它的代码更慢,告诉我你是否有任何其他方法来实现它
    • 不用担心信号/槽的代码​​变慢。使用信号映射器,您可能只是添加了一些函数调用——值得开销。除非你有一个巨大的映射和数百个信号/秒,你不会注意到任何事情。
    【解决方案2】:

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

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

    顺便说一句,您是否真的尝试过这个并遇到了错误,或者您只是在此处发布了它而没有简单地尝试一下?

    【讨论】:

    • 当使用滑块和 lineedit 时,任何一个对象的任何变化都会反映另一个,我直接在信号中使用 valueChanged() 到 slot 中的 setValue()。如果可行,为什么不这样,如果可能的话,你能简要解释一下吗???
    • 我尝试制作了 make 文件并运行了它。单击时没有任何反应。我今天才开始使用 Qt.... 只是一个初学者....
    • @user767060 因为您将一个值从valueChanged() 信号传输到setValue() 插槽。但是这一次你要求一个非参数信号将一个默认参数传输到插槽,那是行不通的。您可以在 connect 方法中从信号中删除参数,以便在调用插槽时丢弃信号的参数,但您不能只是神奇地生成默认参数。这样做的唯一方法是声明插槽(在类定义中)以采用默认参数,但是当您更改 QTextEdit 的代码时,这将不起作用。有关更多信息,请参阅 Qt 的信号/插槽文档
    • @user767060 如果您是这样的初学者,我建议您阅读一些关于 Qt 基础知识的介绍材料。否则,您使用 Qt 是一个不错的选择。
    • @user767060 它起作用但什么也没发生的原因是,错误的连接调用通常不是编译器错误,而只是一个小的运行时错误,Qt 会忽略它(它应该将错误打印到标准输出),因此信号只是没有连接到插槽。
    【解决方案3】:

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

    尝试访问此page

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多