・実現させたいこと
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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}
追記-MainWindowクラスでの実装
uiファイルの方で
クラス名 | 変数名 |
---|---|
QLabel | label_1 |
QLabel | label_2 |
QLabel | label_3 |
QLineEdit | lineEdit |
QPushButton | pushButton |
を用意しておく。
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
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/29 01:31
退会済みユーザー
2021/01/29 02:41 編集
2021/01/29 04:07