在 QLineEdit returnpressed() 时从 QLineEdit 获取文本以附加到 QTextEdit

Posted

技术标签:

【中文标题】在 QLineEdit returnpressed() 时从 QLineEdit 获取文本以附加到 QTextEdit【英文标题】:Getting text from QLineEdit to append to QTextEdit upon QLineEdit returnpressed() 【发布时间】:2011-09-23 01:49:13 【问题描述】:

我正在尝试编写一个简单的 Qt 程序,该程序在 QLineEdit 中获取文本,并在按下返回键时将其附加到 QTextEdit 对象中。

这是我的程序的代码:

#include <QApplication>
#include <QtGui>

#define WIDTH 640
#define HEIGHT 480

int main(int argc, char* argv[])

    QApplication app(argc, argv);

    QTextEdit textArea;
    textArea.setReadOnly(true);

    QLineEdit lineEdit;

    QPushButton quit("Quit");
    QObject::connect(&quit, SIGNAL(clicked()), qApp, SLOT(quit()));

    QHBoxLayout hLayout;
    hLayout.addWidget(&lineEdit);
    hLayout.addWidget(&quit);

    QVBoxLayout vLayout;
    vLayout.addWidget(&textArea);
    vLayout.addLayout(&hLayout);

    QWidget window;
    window.setBaseSize(WIDTH, HEIGHT);
    window.setLayout(&vLayout);
    window.show();

    //This is the line I can not get to work
    QObject::connect(&lineEdit, SIGNAL(returnPressed()), &textArea, SLOT(append(lineEdit.text())));

    return app.exec();


本质上,问题是将 QLineEdit returnPressed() SIGNAL 连接到 QTextEdit append() SLOT。我希望有人能指出我的代码有什么问题。

非常感谢您抽出宝贵时间。

【问题讨论】:

【参考方案1】:

当你运行你的程序时,你应该注意到控制台上出现了如下的 Qt 错误输出..

Object::connect: No such slot QTextEdit::append(lineEdit.text()) in ..

您需要在对connect 的调用中使用QTextEdit 变量名textArea 限定append 引用。

但这并没有多大帮助,因为您只能在调用 connect 时指定信号和槽方法名称和参数类型,因此您不能在其中指定 lineEdit.text()

由于append() 插槽需要QString,理想情况下,您希望连接一个包含QString 的信号,但QLineEdits 没有这样的信号。

您几乎必须自己编写一个可以连接到returnPressed() 并从那里调用textArea.append(lineEdit.text()) 的插槽。您将需要对某种QObject 进行子类化来编写一个插槽,这通常意味着子类化QWidget 并将所有UI 构建代码放入其构造函数中。

您可能还会注意到程序在关闭时会崩溃。由于 Qt 喜欢自行管理大部分QObjects 的销毁,因此通常最好将堆上的所有QObject 实例分配给new。这在技术上并非一直都是必需的,但它更容易:)

【讨论】:

很抱歉,如果这听起来过于 n00bish 但我如何定义自己的插槽函数?我尝试了简单的 void slotFunction(QLineEdit *lineEdit, QTextEdit *textArea)textArea->append(lineEdit->text()); 然后调用它,但我仍然得到 Object::connect 错误。在此先感谢,您提供了巨大的帮助(非常感谢您解释为什么我的程序碰巧崩溃了 :)) 实际上有很多细节需要解释,但简短的版本是:您的插槽函数不需要参数,因为 returnPressed() 没有任何参数。在 QObject 子类中声明一个方法,并确保在它之前有public slots:。此处的示例代码:doc.qt.nokia.com/4.7/signalsandslots.html 这是我根据您的建议编写的代码的更新版本:pastie.org/private/buz9zfrml6krmkiothupq。我收到链接器错误:“C:\projects\qt\Assignment1-build-desktop-Qt_4_7_4_for_Desktop__-_MinGW_4_4__Qt_SDK__Debug\..\Assignment1\main.cpp:14: 错误:未定义对‘vtable for Assignment1’的引用”。有什么办法可以给我一些指导吗?提前致谢。 同时学习 C++ 和 Qt 是一件非常困难的事情 :) 仅仅声明方法是不够的,它们还需要一个实现,这意味着将代码用于QObject 子类在 .h.cpp 文件中。最好将QWidget 子类化并将其用作包含所有相关代码的主窗口。像这样的直接QObject 子类有点尴尬。 啊,好吧我明白你的意思了。我把所有东西都分解成一个漂亮的 QObject 继承类,然后我让它工作了。非常非常非常非常感谢。这是我的最终工作代码:pastie.org/private/7y8nno15rtsbla5uanzf7g。 PS:实际上我确实非常了解 C++,但是我有一个基于 Qt 的家庭作业要在 30 分钟内完成,而且我在不到一个小时前才第一次开始 Qt 呵呵 ;)【参考方案2】:
QObject::connect(&lineEdit, SIGNAL(returnPressed()), &textArea, SLOT(append(lineEdit.text())));

returnPressed() 不接受任何参数,但 append(QString) 确实接受一个参数;一个QString。因此,如果这可行,理论上你会调用 append(""),这意味着你不会附加任何东西。在这个地方使用 lineEdit.text() 也不起作用。

我建议您为小部件创建一个类:

class Widget : public QWidget

public:
    Widget(QWidget parent = 0);
    //Other public functions
private:
    //Private functions and variables
public slots:
    void boom();
;

然后你可以使用 小部件 w(0); w.show(); 在你的主要功能中。

void boom() 将被 returnPressed() 调用,它会使用 lineEdit.text() 并将其附加到 QTextEdit。

我希望这会有所帮助。

【讨论】:

【参考方案3】:

这是可能有用的代码.....

 #include "hwidget.h"

Hwidget::Hwidget(QWidget *parent) :
    QWidget(parent)




void Hwidget::mainform_init(void)

    lineeditp = new QLineEdit;
    quitp = new QPushButton("&Exit");

    hboxlayoutp = new QHBoxLayout;
    hboxlayoutp->addWidget(lineeditp);
    hboxlayoutp->addWidget(quitp,0,0);

    vboxlayoutp = new QVBoxLayout;
    texteditp = new QTextEdit;
    texteditp->setReadOnly(true);
    vboxlayoutp->addWidget(texteditp,0,0);
    vboxlayoutp->addLayout(hboxlayoutp);

    QWidget *mywin = new QWidget;
    mywin->setLayout(vboxlayoutp);
    mywin->setWindowTitle("My Sig and Slot");
    mywin->show();
    lineeditp->setFocus();


void Hwidget::mcopy(void)

    qDebug() <<"i am your copy slot";

    texteditp->setText(lineeditp->text());
   lineeditp->clear();



#include <QApplication>

#include "hwidget.h"

int main (int argc, char *argv[])

    QApplication app(argc,argv);
    Hwidget *hwin = new Hwidget;

  hwin->mainform_init();
  hwin->connect(hwin->quitp,SIGNAL(pressed()),
               qApp,SLOT(quit()));

  hwin->connect(hwin->lineeditp,SIGNAL(returnPressed()),
               hwin,SLOT(mcopy()));

    return app.exec();
    return 0;

#ifndef HWIDGET_H
#define HWIDGET_H

#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QObject>
#include <QString>
#include <QDebug>


class Hwidget : public QWidget

    Q_OBJECT
public:
    explicit Hwidget(QWidget *parent = 0);
    void mainform_init(void);

signals:

public slots:
    void mcopy(void);

private:


   QHBoxLayout *hboxlayoutp;
   QVBoxLayout *vboxlayoutp;
public:
   QPushButton *quitp;
    QLineEdit *lineeditp;
     QTextEdit *texteditp;

;

#endif // HWIDGET_H

【讨论】:

以上是关于在 QLineEdit returnpressed() 时从 QLineEdit 获取文本以附加到 QTextEdit的主要内容,如果未能解决你的问题,请参考以下文章

QLineWidget returnPressed 信号不起作用

QLineEdit 上的活动休假

禁用编辑 QLineEdit

Qt - 在面板中动态添加 QLineEdit

将文件拖入 QtGui.QLineEdit() 以设置 url 文本

QLineEdit 对象的 PyQt 集合