在已包含一些文本的QTextEdit中显示QLineEdit中的文本并实时更新

时间:2015-06-29 05:03:42

标签: c++ qt qtextedit qlineedit

QLineEdit窗口小部件中写入文本的过程是什么,在已包含某些文本的QTextEdit内动态显示?

例如,让我们说QLineEdit要求一个人写一个名字" John"。是否可以在包含{/ p>的QTextEdit内实时显示

名称是 + textFromQLineEdit + ,年龄24

显示的文字必须动态考虑对QLineEdit所做的更改,以便用户无需按任何按钮或按Enter键即可显示他/她的名字。

以下是使用来自textChanged()的信号QLineEdit和来自setText()的信号QTextEdit来连接两个小部件的最小代码(不允许)用于在<{1}}的文本之前和之后添加一些文本

QLineEdit

应该采取哪些措施来保持#include <QLineEdit> #include <QVBoxLayout> #include <QGroupBox> #include <QTextEdit> #include <QApplication> class SmallWindow : public QWidget { Q_OBJECT public: SmallWindow(); private: QLineEdit *nameLine; QTextEdit *textBox; }; SmallWindow::SmallWindow() : QWidget() { setFixedSize(300,250); QLineEdit *nameLine = new QLineEdit; QTextEdit *textBox = new QTextEdit; QWidget::connect(nameLine,SIGNAL(textChanged(QString)),textBox,SLOT(setText(QString))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(nameLine); layout->addWidget(textBox); QGroupBox *group = new QGroupBox(this); group->setLayout(layout); } int main(int argc, char *argv[]) { QApplication app(argc, argv); SmallWindow window; window.show(); app.exec(); } #include "main.moc" 文字前后的文字并实时更新QLineEdit框?

3 个答案:

答案 0 :(得分:6)

创建特殊插槽:

void SmallWindow::pasteText(const QString& str)
{
    textBox->setText(QString("The name is %1 , age 24").arg(str)); 
}

并且不要使用textChanged()信号,因为您只需要用户接受一个名称,因此您需要QLineEdit::editingFinished()(或者QLineEdit::returnPressed(),这取决于您的需求)

connect(nameLine,SIGNAL(editingFinished(QString)),this,SLOT(pasteText(QString)));

此外,您不需要QWidget::connect,因为您在QObject子类中编写此代码,因此没有必要。

还有以下几行:

QLineEdit *nameLine = new QLineEdit;
QTextEdit *textBox = new QTextEdit;

应该是:

nameLine = new QLineEdit;
textBox = new QTextEdit;

答案 1 :(得分:3)

为文本更新创建自己的插槽。我认为你的代码中也有一些错误。

小部件nameLine和textBox已在SmallWindow.h中定义。您可能希望以下列方式在SmallWindow.cpp中创建它们:

nameLine = new QLineEdit;
textBox = new QTextEdit;

GroupBox组也未设置为任何布局。也许您想要创建一个布局并在那里设置小部件?

QVBoxLayout *mainlayout = new QVBoxLayout;
mainlayout->addWidget(group);   
this->setLayout(mainlayout);

如果为文本更新创建自己的插槽,则可以在那里更改textBox的文本内容:

<强> SmallWindow.h

#ifndef SMALLWINDOW_H
#define SMALLWINDOW_H
#include <QLineEdit>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QTextEdit>
class SmallWindow : public QWidget
{
    Q_OBJECT
public:
    SmallWindow();

private slots:
    updateLineEditText(QString name);

private:
    QLineEdit *nameLine;
    QTextEdit *textBox;
};
#endif // SMALLWINDOW_H

<强> SmallWindow.cpp

#include "SmallWindow.h"
SmallWindow::SmallWindow() : QWidget()
{
    setFixedSize(300,250);
    nameLine = new QLineEdit;
    textBox = new QTextEdit;   
    connect(nameLine,SIGNAL(textChanged(QString)),this,
    SLOT(updateLineEditText(QString)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(nameLine);
    layout->addWidget(textBox);
    QGroupBox *group = new QGroupBox(this);
    group->setLayout(layout);

    QVBoxLayout *mainlayout = new QVBoxLayout;
    mainlayout->addWidget(group);   
    this->setLayout(mainlayout);
}


void MainWindow::updateTextEdit(QString name) {
    QString textEditString("The name is ");
    textEditString.append(name);
    textEditString.append(", age 24 ?");
    textBox->setText(textEditString);
}

答案 2 :(得分:0)

这是Qt 5中使用C ++ 11的最小示例。它与Python中的一样简洁。如果您使用的是Qt 5,那么除了connect语句外,您的问题应该与下面的问题完全一致。对于Qt来说,这就是“最小”的意思。避免不会增加问题的绒毛和样板。在这样一个简单的例子中,没有必要为窗口设置单独的类。

#include <QVBoxLayout>
#include <QLineEdit>
#include <QTextEdit>
#include <QApplication>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QWidget window;
   QVBoxLayout layout(&window);
   QLineEdit name;
   QTextEdit text;
   layout.addWidget(&name);
   layout.addWidget(&text);
   QObject::connect(&name, &QLineEdit::textChanged, [&](const QString & name){
      text.setPlainText(QString("The name is %1, age 24.").arg(name));
   });
   window.show();
   return app.exec();
}

下面的Qt 4中也是如此 - 请注意没有任何手动内存管理。这就是你的问题理想上应该如何寻找Qt 4,当然没有插槽的实现。当然,您可以使用connectSlotsByName或明确的connect - 这只是风格问题。

#include <QVBoxLayout>
#include <QLineEdit>
#include <QTextEdit>
#include <QApplication>

class Window : public QWidget {
   Q_OBJECT
   QVBoxLayout m_layout; // not a pointer!
   QLineEdit m_name; // not a pointer, must come after the layout!
   QTextEdit m_text;
   Q_SLOT void on_name_textChanged(const QString & name) {
      m_text.setPlainText(QString("The name is %1, age 24.").arg(name));
   }
public:
   Window() : m_layout(this) {
      m_layout.addWidget(&m_name);
      m_layout.addWidget(&m_text);
      m_name.setObjectName("name");
      QMetaObject::connectSlotsByName(this);
   }
};

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Window window;
   window.show();
   return app.exec();
}

#include "main.moc"