🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2549閲覧

QtのlineEditについてです

wave_vague

総合スコア21

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/28 10:42

・実現させたいこと
Qtでラインエディットを実装しており、ラインエディットの中身を全て削除した後に、ラインエディットに何か文字を1文字でも入力したら3つのラベルに記載されている内容を削除したいです。
以降これの繰り返しです。

・試したこと
コンストラクタ内で下記を実装し、

connect(ui->lineEdit_2, SIGNAL(textEdited(const QString&)), this, SLOT(eraseTestresults()));

シグナルは下記を実装しました。

void MainWindow::eraseTestresults() { if (!ui->lineEdit_2->text().isEmpty()) { ui->label_8->setText(""); ui->label_9->setText(""); ui->label_10->setText(""); } }

現状、lineEdit_2の中身を全て削除したら、label_8~label_10が空になってしまいます。他に方法が考えつかなかったため質問させていただきました。ご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

QLineEditクラスを継承して
内部で編集前の文字列長を管理してみるとかどうでしょう。

c++

1// my_line_edit.hpp 2#pragma once 3 4#include <QLineEdit> 5#include <QWidget> 6 7class MyLineEdit 8:public QLineEdit 9{ 10 Q_OBJECT 11 12 int before_length_;// 編集前の文字列長 13 14public: 15 explicit MyLineEdit(QWidget* parent = nullptr) 16 :QLineEdit(parent), before_length_(0) 17 { 18 // 文字列が編集されたらcheck_lengthスロット実行 19 this->connect(this, &MyLineEdit::textEdited, this, &MyLineEdit::check_length); 20 } 21 22private slots: 23 void check_length(const QString& str) 24 { 25 // 編集前の文字列が0で編集後の文字列が1の場合のみset_a_charシグナル送出 26 if(this->before_length_ == 0 && str.length() <= 1) emit set_a_char(); 27 this->before_length_ = str.length(); 28 } 29 30signals: 31 void set_a_char();// 文字数0から1へ変化した場合に送出されるシグナル 32 33}; 34

c++

1// main.cpp 2#include <my_line_edit.hpp> 3 4#include <QApplication> 5#include <QWidget> 6#include <QVBoxLayout> 7#include <QLabel> 8#include <QObject> 9#include <QPushButton> 10 11int main(int argc, char *argv[]) 12{ 13 QApplication a(argc, argv); 14 15 QWidget root; 16 auto* layout = new QVBoxLayout(&root); 17 18 auto* label_1 = new QLabel("1", &root);// ラベル1 19 auto* label_2 = new QLabel("2", &root);// ラベル2 20 auto* label_3 = new QLabel("3", &root);// ラベル3 21 auto* line_edit = new MyLineEdit(&root);// 今回作成したクラス 22 auto* back_bt = new QPushButton("back", &root);// 再びラベルに文字を入れるためのボタン 23 24 layout->addWidget(label_1); 25 layout->addWidget(label_2); 26 layout->addWidget(label_3); 27 layout->addWidget(line_edit); 28 layout->addWidget(back_bt); 29 30 root.setLayout(layout); 31 32 // 自作したクラスからset_a_charシグナルが飛んできたらラベルを消す 33 QObject::connect(line_edit, &MyLineEdit::set_a_char, [&](){label_1->clear(); label_2->clear(); label_3->clear();}); 34 35 // ボタンが押されたらラベルに文字挿入 36 QObject::connect(back_bt, &QPushButton::clicked, [&](){label_1->setText("1"); label_2->setText("2"); label_3->setText("3");}); 37 38 root.show(); 39 40 return a.exec(); 41}

img

追記-MainWindowクラスでの実装

uiファイルの方で

クラス名変数名
QLabellabel_1
QLabellabel_2
QLabellabel_3
QLineEditlineEdit
QPushButtonpushButton

を用意しておく。

c++

1// mainwindow.h 2#pragma once 3 4#include <QMainWindow> 5 6QT_BEGIN_NAMESPACE 7namespace Ui 8{ 9 class MainWindow; 10} 11QT_END_NAMESPACE 12 13class MainWindow 14:public QMainWindow 15{ 16 Q_OBJECT 17 18 int before_length_;// 編集前の文字列長 19 Ui::MainWindow* ui_; 20 21public: 22 MainWindow(QWidget *parent = nullptr); 23 ~MainWindow(); 24 25private slots: 26 // 編集前の文字列が0で編集後の文字列が1の場合のみset_a_charシグナル送出 27 void check_length(const QString&); 28 29 // ラベルの文字列復活 30 void button_clicked(); 31}; 32

c++

1// mainwindow.cpp 2#include "mainwindow.h" 3#include "./ui_mainwindow.h" 4 5MainWindow::MainWindow(QWidget *parent) 6 : QMainWindow(parent) 7 , before_length_(0) 8 , ui_(new Ui::MainWindow) 9{ 10 this->ui_->setupUi(this); 11 12 // ラインエディットに編集が入った場合文字列長のチェックをする 13 this->connect(this->ui_->lineEdit, &QLineEdit::textEdited, this, &MainWindow::check_length); 14 15 // ボタンが押されたら文字復活 16 this->connect(this->ui_->pushButton, &QPushButton::clicked, this, &MainWindow::button_clicked); 17} 18 19MainWindow::~MainWindow() 20{ 21 delete this->ui_; 22} 23 24void MainWindow::check_length(const QString& str) 25{ 26 // 編集前の文字列が0で編集後の文字列が1の場合ラベル消去 27 if(this->before_length_ == 0 && str.length() <= 1) 28 { 29 this->ui_->label_1->clear(); 30 this->ui_->label_2->clear(); 31 this->ui_->label_3->clear(); 32 } 33 34 this->before_length_ = str.length(); 35} 36 37void MainWindow::button_clicked() 38{ 39 this->ui_->label_1->setText("1"); 40 this->ui_->label_2->setText("2"); 41 this->ui_->label_3->setText("3"); 42} 43

投稿2021/01/28 17:09

編集2021/01/29 02:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wave_vague

2021/01/29 01:31

返信ありがとうございます。 QLineEditを継承しないで、Mainwindow側だけで解決する方法はありますでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/29 02:41 編集

最初に私が提示したコードの肝はQLineEditに変更が入り次第 文字列長が0から1に変化した場合ラベルを消すということです。 なので過去の文字列長を保存しておく変数を用意しておき 変更が入り次第そのチェックと再保存を行うような仕組みが あればよいだけなので その変数を所持するクラスはMainwindowクラスでもよく 仕組みの方はMainwindowクラスのスロットのみで良いので 追記したコードのようになるのではないでしょうか。 しかしなんでもかんでも仕組みや変数をMainwindowクラス に入れてしまうと密結合となってしまい いずれこのコードを読むとき大変になってしまうので 最初に提示した方法のほうが個人的には好きです。
wave_vague

2021/01/29 04:07

大変分かりやすい説明ありがとうございました。理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問