在 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
的信号,但QLineEdit
s 没有这样的信号。
您几乎必须自己编写一个可以连接到returnPressed()
并从那里调用textArea.append(lineEdit.text())
的插槽。您将需要对某种QObject
进行子类化来编写一个插槽,这通常意味着子类化QWidget
并将所有UI 构建代码放入其构造函数中。
您可能还会注意到程序在关闭时会崩溃。由于 Qt 喜欢自行管理大部分QObject
s 的销毁,因此通常最好将堆上的所有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 信号不起作用