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

时间:2011-09-23 01:49:13

标签: c++ qt

我正在尝试编写一个简单的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。我希望有人可以指出我的代码有什么问题。

非常感谢你的时间。

3 个答案:

答案 0 :(得分:2)

当您运行程序时,您应该在控制台上注意到以下Qt错误输出..

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

您需要使用append变量名称connectQTextEdit的来电中的textArea引用进行限定。

但这并没有多大帮助,因为在调用connect时你只能指定信号和插槽方法名称和参数类型,所以你不能在那里指定lineEdit.text()

由于append()广告位需要QString,理想情况下您需要连接包含QString的信号,但QLineEdit没有此类信号。< / p>

您必须自己写一个插槽,以便连接到returnPressed()并从那里拨打textArea.append(lineEdit.text())。您需要继承某种类型的QObject来编写一个插槽,这通常意味着子类化QWidget并将所有UI构建代码放在其构造函数中。

您可能还注意到关闭它时程序崩溃了。由于Qt喜欢管理大多数QObject本身的破坏,因此通常最好使用QObject在堆上分配所有new个实例。这在技术上并不是必需的,但它更容易:)

答案 1 :(得分:0)

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。

我希望这会有所帮助。

答案 2 :(得分:0)

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

 #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