大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Qtプログラミング – スプレッドシートで文字列検索

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2019/11/25
最終更新日:2019/11/25
カテゴリー:技術情報

津路です。おはようございます。
前回では、スプレッドシートの変更を検知して、閉じるときに保存するよう促すダイアログ表示をしました。
今回は、文字列検索機能を追加します。

Qtプログラミング – ダイアログで作成したダイアログクラスをもとに検索用のクラスを作成します。

引数は、文字列とQt::CaseSensitivityです。
ダイアログには、入力文字列、大文字小文字チェックボックス、逆方向検索チェックボックス、ボタン2つを装備します。
主な関数は、前方検索と、後方検索です。

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
	Q_OBJECT
public:
	FindDialog(QWidget *parent=0);
signals:
	void findNext(const QString &str, Qt::CaseSensitivity cs);
	void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots:
	void findClicked();
	void enableFindButton(const QString &text);

private:
	QLabel *label;
	QLineEdit *lineEdit;
	QCheckBox *caseCheckBox;
	QCheckBox *backwardCheckBox;
	QPushButton *findButton;
	QPushButton *closeButton;
};
#endif

上記それぞれを実装します。

#include <QtGui>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
	: QDialog(parent)
{
	label=new QLabel(tr("Find &what:"));
	lineEdit = new QLineEdit;
	label->setBuddy(lineEdit);
	
	caseCheckBox = new QCheckBox(tr("Match &case"));
	backwardCheckBox = new QCheckBox(tr("Search &backward"));

	findButton = new QPushButton(tr("&Find"));
	findButton->setDefault(true);
	findButton->setEnabled(false);
	closeButton = new QPushButton(tr("Close"));

	connect(lineEdit, SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));
	connect(findButton, SIGNAL(clicked()),this,SLOT(findClicked()));
	connect(closeButton, SIGNAL(clicked()),this,SLOT(close()));

	QHBoxLayout *topLeftLayout = new QHBoxLayout;
	topLeftLayout->addWidget(label);
	topLeftLayout->addWidget(lineEdit);

	QVBoxLayout *leftLayout = new QVBoxLayout;
	leftLayout->addLayout(topLeftLayout);
	leftLayout->addWidget(caseCheckBox);
	leftLayout->addWidget(backwardCheckBox);

	QVBoxLayout *rightLayout = new QVBoxLayout;
	rightLayout->addWidget(findButton);
	rightLayout->addWidget(closeButton);
	rightLayout->addStretch();

	QHBoxLayout *mainLayout = new QHBoxLayout;
	mainLayout->addLayout(leftLayout);
	mainLayout->addLayout(rightLayout);
	setLayout(mainLayout);

	setWindowTitle(tr("Find"));
	setFixedHeight(sizeHint().height());
}
void FindDialog::findClicked()
{
	QString text = lineEdit->text();
	Qt::CaseSensitivity cs = caseCheckBox->isChecked() ?
		Qt::CaseSensitive : Qt::CaseInsensitive;
	if(backwardCheckBox->isChecked()){
		emit findPrevious(text, cs);
	}else{
		emit findNext(text, cs);
	}
}
void FindDialog::enableFindButton(const QString &text)
{
	findButton->setEnabled(!text.isEmpty());
}



さて、FindDialogクラスの利用は次回にします。

    上に戻る