歴史的課題と解決策
1. 課題
- C言語は真正な文字列型をサポートしていない。
- C言語では文字配列と関数群で文字列操作を行っている。
- C言語はカスタム型をサポートしていないため、文字列型を定義できない。
2. 解決策
- C++への進化においてカスタム型が導入された。
- C++ではクラスを使って文字列を定義できる。
3. 標準ライブラリSTL
- STLはC++と共に発表される標準ライブラリである。
- テンプレート技術によって構成されている。
- 一般的なアルゴリズムやデータ構造が含まれている。
- 文字列型も含んでいる。
4. QtとSTLの比較
- STLの実装はコンパイラベンダーに依存している。
- STLのインターフェースは標準である。
- 異なるベンダーのコンパイラにはSTLの実装に差がある。
- STLに依存するプログラムは異なるプラットフォームでの動作が異なる可能性がある。
Qtの文字列クラス
1. Qtの文字列クラス
- Unicodeエンコードを採用し、中国語などもサポートしている。
- インプリシット共有技術を使用してメモリ効率を向上させている。
- プラットフォームに依存しない運用が可能である。
2. QStringとstringの比較
- QStringは文字列と数字の相互変換を直接サポートしている。
- QStringは文字列の大小比較を直接サポートしている。
- QStringは異なる文字コード間の変換を直接サポートしている。
- QStringはstd::stringとstd::wstringの相互変換を直接サポートしている。
- QStringは正規表現の使用を直接サポートしている。
- QStringはQtのグラフィカルUIコンポーネントに広く使われている。
#include <QApplication>
#include <QDebug>
#include <QString>
void Sample_1()
{
QString s = "add";
s.append(" "); //"add "
s.append("Qt"); //"add Qt"
s.prepend(" "); //" add Qt"
s.prepend("C++");//"C++ and Qt"
qDebug() << s;
s.replace("add", "&"); //"C++ & Qt"
qDebug() << s;
}
void Sample_2()
{
QString s = "";
int index = 0;
s.sprintf("%d. I'm %s, thank you!", 1, "SantaClaus"); //"1. I'm SantaClaus, thank you!"
qDebug() << s;
index = s.indexOf(",");
//からインデックス0までの文字列
s = s.mid(0, index); //"1. I'm SantaClaus"
qDebug() << s;
index = s.indexOf(".");
s = s.mid(index + 1,s.length()); //" I'm SantaClaus";
s = s.trimmed(); //"I'm SantaClaus";
qDebug() << s;
index = s.indexOf(" ");
s = s.mid(index + 1, s.length()); //"SantaClaus"
qDebug() << s;
}
void Sample_3(QString* a, int len)
{
for(int i=0;i
本セクションではテキストボックスの右揃えとメッセージ処理中の文字列の扱いについて追加しています。
#include "QCalculatorUI.h"
QCalculatorUI::QCalculatorUI() : QWidget(NULL,Qt::WindowCloseButtonHint )
{
}
bool QCalculatorUI::construct()
{
bool ret = true;
m_edit = new QLineEdit(this);//親コンポーネントはthisの理由:結合関係、共に生死を共にする
const char* btnText[20] =
{
"7", "8", "9", "+", "(",
"4", "5", "6", "-", ")",
"1", "2", "3", "*", "<-",
"0", ".", "=", "/", "C"
};
if(m_edit != NULL)
{
m_edit->resize(240,30);
m_edit->move(10,10);
m_edit->setReadOnly(true);//テキストボックスを読み取り専用に設定、文字入力不可
m_edit->setAlignment(Qt::AlignRight);//右揃え
}
else
{
ret = false;
}
for(int i=0; (i<4) && ret; i++)//(i<4) && retはQLineEditが生成されていない場合、ここは必要ない
{
for(int j=0; (j<5) && ret; j++)
{
m_buttons[i*5 + j] = new QPushButton(this);
if(m_buttons[i*5 + j])
{
m_buttons[i*5 + j] ->resize(40,40);//[i*5 + j]は一次元として計算
m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);//横座標移動5回、縦座標移動4回
m_buttons[i*5 + j]->setText(btnText[i*5 + j]);
connect(m_buttons[i*5 + j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));//信号を現在のオブジェクトのonButtonclick()にマッピング
}
else
{
ret = false;
}
}
}
return ret;
}
QCalculatorUI* QCalculatorUI::NewInstance()
{
QCalculatorUI* ret = new QCalculatorUI();
if(!(ret && ret->construct()))
{
delete ret;
ret = NULL;
}
return ret;
}
void QCalculatorUI::show()
{
QWidget::show();
setFixedSize(width(), height());//show()後に配置する必要がある
}
void QCalculatorUI::onButtonClicked()
{
QPushButton* btn = (QPushButton*)sender();//送信元のオブジェクトへのポインタを返す
QString clicktext = btn->text();
if(clicktext == "<-")
{
QString text = m_edit->text();
if(text.length() > 0)
{
text.remove(text.length() - 1, 1);
m_edit->setText(text);
}
}else if(clicktext == "C")
{
m_edit->setText("");
}else if(clicktext == "=")
{
}else
{
m_edit->setText(m_edit->text() + clicktext);
}
}
QCalculatorUI::~QCalculatorUI()
{
}
まとめ
1. 応用開発では多くの場合、文字列処理を行う。
2. Qtはクロスプラットフォーム開発に適している。
3. QtのQStringはSTLのstringより強力で使いやすい。
4. QtのGUIはQStringに依存している。
5. 開発プロジェクトではさまざまなライブラリを総合的に選択する必要がある。