Создать счетчик символов для QLineEdit - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь создать простой счетчик символов, такой как в твиттере, в QT специально с помощью функции QLineEdit.В идеале он должен записывать количество символов, введенных в QLineEdit, и отображать число, записанное в отдельной метке дисплея.Например, у spotify есть счетчик символов при именовании и добавлении описания в список воспроизведения.

Функция, которую я объявил для подсчета количества символов, введенных в QLineEdit:определяется так:

void MainWindow::countChar()
{
    QString tempString = ui->displayLabel->text(); //temp variable to hold the lineEdit's text
    int output = tempString.size(); //to get the number of characters in the lineEdit
    QString s = QString::number(output);//convert an int to QString
    ui->CharCounter->setText(s); //display the number in the displayLabel(CharCounter)
    ui->CharCounter->adjustSize();
}

Я вызываю эту функцию в моем main.cpp под объектом, w.

w.countChar();

Причина, по которой я хочу создать функцию счетчика символов, заключается в том, что я установил ограничение на число символов для QLineEdit, чтобы все, что вводит пользователь, можно было заполнить в основной displayLabel с минимальным размером окна.Я сделал это, написав другую функцию:

void MainWindow::setlineInputTextCharLimit(int limit)
{
    ui->inputText->setMaxLength(limit);
}

, которую я вызывал для того же объекта, w:

w.setLineInputTextCharLimit(200);

QTCreator может успешно создавать, но charCounter displayLabel не изменяетсяпосле ввода некоторого количества текста в QLineEdit.

изображение построенного приложения

Ясно, что displayLabel для счетчика символов читается и активируется, однако, когда я ввожу любое количествотекст, значение не меняется.

Результат после того, как в QLineEdit введен какой-то текст

Так что, если displayLabel зарегистрирован и отображается значение, функция должна работатьно в этом тоже определенно что-то не так, потому что значение не меняется ни на что из этого «0» ?.

Редактировать: файл пользовательского интерфейса:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>554</width>
    <height>463</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>20</y>
      <width>311</width>
      <height>211</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QLineEdit" name="inputText"/>
     </item>
     <item>
      <widget class="QPushButton" name="textBtn">
       <property name="text">
        <string>Display Text</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLabel" name="displayLabel">
       <property name="sizePolicy">
        <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="minimumSize">
        <size>
         <width>100</width>
         <height>100</height>
        </size>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="scaledContents">
        <bool>true</bool>
       </property>
       <property name="wordWrap">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLabel" name="CharCounter">
       <property name="enabled">
        <bool>true</bool>
       </property>
       <property name="sizePolicy">
        <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>0</height>
        </size>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="scaledContents">
        <bool>true</bool>
       </property>
       <property name="wordWrap">
        <bool>true</bool>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>554</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

И вот соединение разъема сигнала:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->textBtn, &QPushButton::clicked, this, &MainWindow::setText);
    connect(ui->inputText, &QLineEdit::textChanged, this, &MainWindow::countChar);
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я читал текст из QLabel, а не из QLineEdit.Поэтому часть в моем коде:

QString tempString = ui->displayLabel->text();

считывала текст с метки только тогда, когда я хотел прочитать текст, введенный в QLineEdit.Поэтому я изменил код на:

QString tempString = ui->inputText->text();

, и это решило проблему.Спасибо @FrozenM и @ eyllanesc

0 голосов
/ 23 сентября 2018

Если вы хотите считать тексты, вы должны считать каждый раз, когда текст меняется, и для этого вы должны использовать сигнал textChanged(), в следующем коде я показываю пример:

#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QWidget>

class CounterWidget: public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
    Q_PROPERTY(int maxLenght READ maxLenght WRITE setMaxLenght)
    Q_PROPERTY(int length READ length)
public:
    CounterWidget(QWidget *parent=nullptr):
        CounterWidget(200, parent)
    {
    }
    CounterWidget(int maxLength, QWidget *parent=nullptr):
        QWidget(parent),
        layout(this)
    {
        layout.addWidget(&lineEdit);
        layout.addWidget(&counterLabel, 0, Qt::AlignTop | Qt::AlignRight);
        connect(&lineEdit, &QLineEdit::textChanged, this, &CounterWidget::countChar);
        connect(&lineEdit, &QLineEdit::textChanged, this, &CounterWidget::textChanged);
        lineEdit.setMaxLength(maxLength);
        countChar("");
    }
    QString text() const{
        return lineEdit.text();
    }
    void setText(const QString &text){
        lineEdit.setText(text);
    }
    int maxLenght() const{
        return  lineEdit.maxLength();
    }
    void setMaxLenght(int maxLenght){
        lineEdit.setMaxLength(maxLenght);
    }
    int length() const{
        return lineEdit.text().size();
    }
signals:
    void textChanged(const QString & text);
private slots:
    void countChar(const QString & text){
        QString text_label = QString("%1/%2").arg(text.size()).arg(lineEdit.maxLength());
        counterLabel.setText(text_label);
    }
private:
    QVBoxLayout layout;
    QLineEdit lineEdit;
    QLabel counterLabel;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CounterWidget w;
    w.show();

    return a.exec();
}

#include "main.moc"

enter image description here

...