Получение текста из QLineEdit для добавления в QTextEdit после QLineEdit returnpressed () - PullRequest
2 голосов
/ 23 сентября 2011

Я пытаюсь написать простую программу 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 SIGNAL returnPressed () к слоту QTextEdit append ().Я надеюсь, что кто-то может указать, что не так с моим кодом.

Большое спасибо заранее за ваше время.

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Когда вы запускаете вашу программу, вы должны заметить на консоли следующий вывод ошибки Qt ..

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

Вам нужно будет квалифицировать ссылку append в своем вызове на connect с именем переменной QTextEdit textArea.

Но это не сильно поможет, потому что вы можете указывать только имена методов сигналов и слотов и типы параметров при вызове connect, поэтому вы не можете указать lineEdit.text() там.

Поскольку слот append() ожидает QString, в идеале вы хотели бы подключить сигнал, который включает QString, но такого сигнала нет для QLineEdit s.

В значительной степени вы сами должны написать слот, к которому можно подключиться к returnPressed() и позвонить оттуда textArea.append(lineEdit.text()). Вам нужно будет создать некоторый подкласс QObject, чтобы написать слот, который обычно будет означать создание подкласса QWidget и помещение всего кода сборки вашего пользовательского интерфейса в его конструктор.

Вы также можете заметить, что ваша программа падает, когда вы закрываете ее. Поскольку Qt любит управлять уничтожением большинства QObject s, обычно лучше выделить все QObject экземпляров в куче с помощью new. Технически это не всегда необходимо, но гораздо проще:)

0 голосов
/ 05 марта 2013

вот код, который может быть полезен .....

 #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
0 голосов
/ 25 сентября 2011
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();
};

Тогда вы можете просто использовать Widget w (0); w.show (); в вашей основной функции.

void boom () будет вызываться функцией returnPressed (), и для этого потребуется lineEdit.text () и добавить его в QTextEdit.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...