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

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

Qtプログラミング – スプレッドシート検索機能実装

著者:津路高広
公開日:2019/11/29
最終更新日:2019/12/13
カテゴリー:技術情報

津路です。
前回に引き続き、FindDialogクラスを、mainwindowクラスで利用します。
今回は、スプレッドシートクラスに、前方検索と後方検索を実装します。
以下、ヘッダファイルです。

#ifndef SPREADSHEET_H
#define SPREADSHEET_H

#include <QTableWidget>
class Cell;
class SpreadsheetCompare;

class Spreadsheet : public QTableWidget
{
    Q_OBJECT
public:
    Spreadsheet(QWidget *parent = 0);
    void clear();
public slots:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);
signals:
    void modified();
private slots:
private:
    Cell *cell(int, int) const;
    QString text(int, int) const;
};
#endif

以下、実装ファイルです。
前方検索では、選択中のセルより先を検索対象にします。
後方検索では、逆に、選択中のセルより前を検索対象にします。

void Spreadsheet::findNext(const QString &str, Qt::CaseSensitivity cs)
{
    int row = currentRow();
    int column = currentColumn()+1;
    while(row < RowCount)
    {
    while(column < ColumnCount)
    {
        if(text(row,column).contains(str,cs))
        {
        clearSelection();
        setCurrentCell(row,column);
        activateWindow();
        return;
        }
            column++;
	}
	column=0;
	row++;
    }
    QApplication::beep();
}
void Spreadsheet::findPrevious(const QString &str, Qt::CaseSensitivity cs)
{
    int row = currentRow();
    int column = currentColumn()-1;
    while(row >=0)
    {
	while(column >=0)
	{
	    if(text(row,column).contains(str,cs))
	    {
		clearSelection();
		setCurrentCell(row,column);
		activateWindow();
		return;
	    }
	    column--;
	}
	column=ColumnCount-1;
	row--;
    }
    QApplication::beep();
}

これらの関数を利用します。

void MainWindow::find()
{
    if(!findDialog) {
	findDialog = new FindDialog(this);
	connect(findDialog, SIGNAL(findNext(const QString &, Qt::CaseSensitivity)), spreadsheet, SLOT(findNext(const QString &, Qt::CaseSensitivity)));
	connect(findDialog, SIGNAL(findPrevious(const QString &, Qt::CaseSensitivity)), spreadsheet, SLOT(findPrevious(const QString &, Qt::CaseSensitivity)));
    }
    findDialog->show();
    findDialog->activateWindow();
}
    上に戻る