August 28, 2011

Atsushi4 Atsushi4
Lab Rat
11 posts

[SOLVED] QTextDocumentのテキスト検索

 

テキストの検索,ハイライト表示が欲しくてコード書いてみました。

こんなカンジでいいんでしょうか。

findtext.cpp ※※※追記:このコードよりtakumiasaki氏のコメントのコードを採用して下さい。※※※

  1. #include <QtGui>
  2.  
  3. const char *browseText = "<FONT color = blue>※女性からみた男のダメ姿ランキング トップ10<BR>"
  4.         "1位・飲食店などで、店員に偉そうにする(態度がでかい)<BR>"
  5.         "2位・割り勘で10円台まできっちり請求してくる<BR>"
  6.         "3位・蛾やゴキブリが出現したときに大騒ぎする<BR>"
  7.         "4位・食後に爪楊枝で思いっきり歯の掃除をする<BR>"
  8.         "5位・オフィスの机の上がフィギュアだらけ<BR>"
  9.         "6位・下着代わりりの柄モノTシャツが、ワイシャツの下から透けている<BR>"
  10.         "7位・車の駐車が下手<BR>"
  11.         "8位・職場ではスーツ姿が決まっているのに、私服がイマイチ<BR>"
  12.         "9位・電車の中で携帯ゲームに夢中になっている<BR>"
  13.         "10位・おしぼりで顔を拭く<BR></FONT>"
  14.         "<BR>"
  15.         "<B>170 :名無しさん@七周年 :2006/11/24(金) 02:04:41 ID:/5Mwkhru0</B><BR>"
  16.         "<FONT color = red>※ワイシャツの下から大騒ぎするランキング トップ10<BR>"
  17.         "1位・職場で、フィギュアに偉そうにする(携帯ゲームがでかい)<BR>"
  18.         "2位・下着代わりの10円、Tシャツがおしぼり<BR>"
  19.         "3位・電車の中で蛾やゴキブリが柄モノスーツ姿が決まっているのに<BR>"
  20.         "4位・歯で思いっきり車の掃除をするが下手<BR>"
  21.         "5位・オフィスが職場で机の上が台<BR>"
  22.         "6位・代わりの店員がきっちりTシャツ、態度が透けている<BR>"
  23.         "7位・車の駐車車の車の駐車が電車<BR>"
  24.         "8位・フィギュアの態度がイマイチ<BR>"
  25.         "9位・職場では下着に夢中になっている<BR>"
  26.         "10位・ゴキブリで顔を拭く</FONT>";
  27.  
  28. typedef QMap<QTextCursor, QTextCharFormat> SelectedMap;
  29.  
  30. class MainWindow : public QDialog
  31. {
  32.     Q_OBJECT
  33. public:
  34.     MainWindow()
  35.         : browser(new QTextBrowser)
  36.     {
  37.         QLineEdit *line = new QLineEdit;
  38.         QVBoxLayout *layout = new QVBoxLayout;
  39.         layout->addWidget(line);
  40.         layout->addWidget(browser);
  41.         setLayout(layout);
  42.         connect(line, SIGNAL(textChanged(QString)), SLOT(search(QString)));
  43.         resize(600,300);
  44.         // ハイライト表示の設定
  45.         highlightFormat.setForeground(QBrush(Qt::red));
  46.         highlightFormat.setBackground(QBrush(Qt::yellow));
  47.  
  48.         // テキトー
  49.         browser->setHtml(browseText);
  50.         QFont font = this->font();
  51.         font.setPointSize(14);
  52.         browser->setFont(font);
  53.         line->setPlaceholderText("検索する文字列を入力して下さい");
  54.     }
  55.  
  56. private slots:
  57.     void search(QString text)
  58.     {
  59.         // ハイライト表示を元に戻す
  60.         for (SelectedMap::iterator i = selected.begin()
  61.              ; i != selected.end(); ++i)
  62.         {
  63.             QTextCursor(i.key()).setCharFormat(*i);
  64.         }
  65.         selected.clear();
  66.  
  67.         // 検索
  68.         QTextDocument *document = browser->document();
  69.         QTextCursor cursor(document);
  70.         while (true)
  71.         {
  72.             cursor = document->find(text, cursor);
  73.             if (cursor.position() == -1)
  74.                 return;
  75.  
  76.             // 元の表示形式を保存してハイライト表示
  77.             selected.insert(cursor, cursor.charFormat());
  78.             cursor.mergeCharFormat(highlightFormat);
  79.         }
  80.     }
  81.  
  82. private:
  83.     QTextBrowser *browser;
  84.     SelectedMap selected;
  85.     QTextCharFormat highlightFormat;
  86. };
  87.  
  88. int main(int argc, char *argv[])
  89. {
  90.     QApplication a(argc, argv);
  91.     QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
  92.     MainWindow w;
  93.     w.show();
  94.     return a.exec();
  95. }
  96.  
  97. #include "findtext.moc"

3 replies

August 29, 2011

takumiasaki takumiasaki
Ant Farmer
14 posts

QSyntaxHighlighter というそのために作られたクラスがありますので、それを使います。
参考: Syntax Highlighting in QTextEdit [doc.qt.nokia.com]

  1. #include <QtGui>
  2.  
  3. const char *browseText = "<FONT color = blue>※女性からみた男のダメ姿ランキング トップ10<BR>"
  4.         "1位・飲食店などで、店員に偉そうにする(態度がでかい)<BR>"
  5.         "2位・割り勘で10円台まできっちり請求してくる<BR>"
  6.         "3位・蛾やゴキブリが出現したときに大騒ぎする<BR>"
  7.         "4位・食後に爪楊枝で思いっきり歯の掃除をする<BR>"
  8.         "5位・オフィスの机の上がフィギュアだらけ<BR>"
  9.         "6位・下着代わりりの柄モノTシャツが、ワイシャツの下から透けている<BR>"
  10.         "7位・車の駐車が下手<BR>"
  11.         "8位・職場ではスーツ姿が決まっているのに、私服がイマイチ<BR>"
  12.         "9位・電車の中で携帯ゲームに夢中になっている<BR>"
  13.         "10位・おしぼりで顔を拭く<BR></FONT>"
  14.         "<BR>"
  15.         "<B>170 :名無しさん@七周年 :2006/11/24(金) 02:04:41 ID:/5Mwkhru0</B><BR>"
  16.         "<FONT color = red>※ワイシャツの下から大騒ぎするランキング トップ10<BR>"
  17.         "1位・職場で、フィギュアに偉そうにする(携帯ゲームがでかい)<BR>"
  18.         "2位・下着代わりの10円、Tシャツがおしぼり<BR>"
  19.         "3位・電車の中で蛾やゴキブリが柄モノスーツ姿が決まっているのに<BR>"
  20.         "4位・歯で思いっきり車の掃除をするが下手<BR>"
  21.         "5位・オフィスが職場で机の上が台<BR>"
  22.         "6位・代わりの店員がきっちりTシャツ、態度が透けている<BR>"
  23.         "7位・車の駐車車の車の駐車が電車<BR>"
  24.         "8位・フィギュアの態度がイマイチ<BR>"
  25.         "9位・職場では下着に夢中になっている<BR>"
  26.         "10位・ゴキブリで顔を拭く</FONT>";
  27.  
  28. class SearchHighLighter : public QSyntaxHighlighter
  29. {
  30.     Q_OBJECT
  31. public:
  32.     explicit SearchHighLighter(QObject *parent = 0) :
  33.         QSyntaxHighlighter(parent)
  34.     {
  35.         init();
  36.     }
  37.  
  38.     explicit SearchHighLighter(QTextDocument *document) :
  39.         QSyntaxHighlighter(document)
  40.     {
  41.         init();
  42.     }
  43.  
  44.     void init()
  45.     {
  46.         highlightFormat.setForeground(QBrush(Qt::red));
  47.         highlightFormat.setBackground(QBrush(Qt::yellow));
  48.     }
  49.  
  50. protected:
  51.     void highlightBlock(const QString &text)
  52.     {
  53.         if (mSearchText.isEmpty())
  54.             return;
  55.  
  56.         int index;
  57.         int from = 0;
  58.         while ((index = text.indexOf(mSearchText, from)) >= 0) {
  59.             setFormat(index, mSearchText.length(), highlightFormat);
  60.             from = index + mSearchText.length();
  61.         }
  62.     }
  63.  
  64. public slots:
  65.     void setSearchText(const QString &text)
  66.     {
  67.         mSearchText = text;
  68.     }
  69.  
  70. private:
  71.     QString mSearchText;
  72.     QTextCharFormat highlightFormat;
  73. };
  74.  
  75. class MainWindow : public QDialog
  76. {
  77.     Q_OBJECT
  78. public:
  79.     MainWindow()
  80.         : browser(new QTextBrowser), highlighter(new SearchHighLighter(this))
  81.     {
  82.         QLineEdit *line = new QLineEdit;
  83.         QVBoxLayout *layout = new QVBoxLayout;
  84.         layout->addWidget(line);
  85.         layout->addWidget(browser);
  86.         setLayout(layout);
  87.         connect(line, SIGNAL(textChanged(QString)), SLOT(search(QString)));
  88.         resize(600,300);
  89.  
  90.         // テキトー
  91.         browser->setHtml(browseText);
  92.  
  93.         // ハイライト表示の設定
  94.         highlighter->setDocument(browser->document());
  95.  
  96.         QFont font = this->font();
  97.         font.setPointSize(14);
  98.         browser->setFont(font);
  99.         line->setPlaceholderText("検索する文字列を入力して下さい");
  100.     }
  101.  
  102. private slots:
  103.     void search(QString text)
  104.     {
  105.         highlighter->setSearchText(text);
  106.         highlighter->rehighlight();
  107.     }
  108.  
  109. private:
  110.     QTextBrowser *browser;
  111.     SearchHighLighter *highlighter;
  112. };
  113.  
  114. int main(int argc, char *argv[])
  115. {
  116.     QApplication a(argc, argv);
  117.     QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
  118.     MainWindow w;
  119.     w.show();
  120.     return a.exec();
  121. }
  122.  
  123. #include "findtext.moc"

August 29, 2011

Atsushi4 Atsushi4
Lab Rat
11 posts

な,な,な,なんてこったー。
そんな便利クラスが有ったなんて。。。

どうもありがとうございます。

March 23, 2012

Atsushi4 Atsushi4
Lab Rat
11 posts

exampleも有ったのね。。。
http://qt-project.org/doc/qt-4.8/richtext-syntaxhighlighter.html

 
  ‹‹ [SOLVED] Need help with regexp for Kanji      [SOLVED]「API 設計の原理原則」のレビューをお願いします。 ››

You must log in to post a reply. Not a member yet? Register here!