我正在尝试编写一个简单的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。我希望有人可以指出我的代码有什么问题。
非常感谢你的时间。
答案 0 :(得分:2)
当您运行程序时,您应该在控制台上注意到以下Qt错误输出..
Object::connect: No such slot QTextEdit::append(lineEdit.text()) in ..
您需要使用append
变量名称connect
对QTextEdit
的来电中的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