【问题标题】:Getting text from QLineEdit to append to QTextEdit upon QLineEdit returnpressed()在 QLineEdit returnpressed() 时从 QLineEdit 获取文本以附加到 QTextEdit
【发布时间】: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。我希望有人能指出我的代码有什么问题。

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

【问题讨论】:

    标签: c++ qt


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 2012-08-23
        • 2021-01-08
        • 1970-01-01
        • 2014-05-30
        相关资源
        最近更新 更多