| ■ | Qtで日本語を表示するには |
#include <stdio.h>
#include "qapplication.h"
#include "qlabel.h"
#include "qpushbutton.h"
#include "qtextcodec.h"
#include "hello2.h"
HelloWidget::HelloWidget(QWidget* parent, char* name=0){
QTextCodec* codec = QTextCodec::codecForName("eucJP");
QFont* font = new QFont("fixed", 16, QFont::Normal);
QLabel* laba = new QLabel(codec->toUnicode("波浪ワールド"), this);
QPushButton* cmda = new QPushButton(this);
QPushButton* cmde = new QPushButton(this);
laba->setFont( * font);
cmda->setText(codec->toUnicode("警報"));
cmda->setFont( * font);
cmde->setText(codec->toUnicode("避難"));
cmde->setFont( * font);
laba->move(30, 20);
laba->setMinimumSize(laba->sizeHint());
cmda->move(30, 60);
cmde->move(170, 60);
QObject::connect(cmda, SIGNAL(clicked()), this, SLOT(buttonClicked()));
QObject::connect(cmde, SIGNAL(clicked()), this, SLOT(close()));
this->resize(300, 100);
this->setCaption("hello world");
}
void HelloWidget::buttonClicked(void){
fprintf(stdout, "Button Clicked!\n");
}
int main(int argc, char* argv[]){
QApplication* a = new QApplication(argc, argv);
QTextCodec* codec = QTextCodec::codecForName("eucJP");
a->setDefaultCodec(codec);
HelloWidget* my = new HelloWidget(NULL);
a->setMainWidget(my);
my->show();
return a->exec();
}
/* end. */
|
QTextCodec* codec = QTextCodec::codecForName("eucJP");
|
QFont* font = new QFont("fixed", 16, QFont::Normal);
laba->setFont( * font);
|
(*1)シフトJISコードの場合は「SJIS」です。
次に上のソースコードがインクルードしているヘッダファイルを下のように作り、
「hello2.h」と名付けます。
#include "qwidget.h"
class HelloWidget : public QWidget {
Q_OBJECT
public:
HelloWidget(QWidget* parent, char* name=0);
public slots:
void buttonClicked(void);
};
で、先述の通り、mocを使ったりするためコンパイルが若干面倒なため、
Makefileも作ります。
CC = gcc
CXX = g++
QTDIR = /usr/local/qt
MOC = ${QTDIR}/bin/moc
CFLAGS = -I$(QTDIR)/include -g -O
LDFLAGS = -L$(QTDIR)/lib
LIBS = -lqt
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CFLAGS) -o $@ $<
SRCS2 = hello2.cpp moc_hello2.cpp
OBJS2 = hello2.o moc_hello2.o
hello2: $(SRCS2) $(OBJS2)
$(CXX) -o $@ $(LDFLAGS) $(OBJS2) $(LIBS)
moc_hello2.cpp : hello2.h
$(MOC) -o $@ $<
# end.
ちなみに、Qtアプリケーションにデフォルトのcodecを指定しておくこともできます。 日本語文字列をリテラル直書きで使うことが多い場合には、こちらの方が書きやすいでしょう。
#include <stdio.h>
#include "qapplication.h"
#include "qlabel.h"
#include "qpushbutton.h"
#include "qtextcodec.h"
#include "hello2.h"
HelloWidget::HelloWidget(QWidget* parent, char* name=0){
QFont* font = new QFont("fixed", 16, QFont::Normal);
QLabel* laba = new QLabel(tr("波浪ワールド"), this);
QPushButton* cmda = new QPushButton(this);
QPushButton* cmde = new QPushButton(this);
laba->setFont( * font);
cmda->setText(tr("警報"));
cmda->setFont( * font);
cmde->setText(tr("避難"));
cmde->setFont( * font);
laba->move(30, 20);
laba->setMinimumSize(laba->sizeHint());
cmda->move(30, 60);
cmde->move(170, 60);
QObject::connect(cmda, SIGNAL(clicked()), this, SLOT(buttonClicked()));
QObject::connect(cmde, SIGNAL(clicked()), this, SLOT(close()));
this->resize(300, 100);
this->setCaption("hello world");
}
void HelloWidget::buttonClicked(void){
fprintf(stdout, "Button Clicked!\n");
}
int main(int argc, char* argv[]){
QApplication* a = new QApplication(argc, argv);
QTextCodec* codec = QTextCodec::codecForName("eucJP");
a->setDefaultCodec(codec);
HelloWidget* my = new HelloWidget(NULL);
a->setMainWidget(my);
my->show();
return a->exec();
}
/* end. */
|
QTextCodec* codec = QTextCodec::codecForName("eucJP");
a->setDefaultCodec(codec);
|
| ■ | Qtで日本語を入力するには |
…実験台として、ラインエディット(QLineEdit)ウィジェットに日本語を入力してみます。 まずヘッダファイルを「linee.h」とか適当な名前で下のように作ります。
/* linee.h */
#include "qwidget.h"
#include "qlineedit.h"
class HelloWidget : public QWidget {
Q_OBJECT
public:
HelloWidget(QWidget* parent, char* name=0);
public slots:
void buttonClicked(void);
protected:
QLineEdit* leda;
};
/* end. */
|
/* linee.cpp */
#include >stdio.h<
#include "qapplication.h"
#include "qlabel.h"
#include "qpushbutton.h"
#include "qtextcodec.h"
#include "linee.h"
HelloWidget::HelloWidget(QWidget* parent, char* name=0){
QFont* font = new QFont("fixed", 16, QFont::Normal);
QLabel* laba = new QLabel(tr("文字列を入力してチョ:"), this);
this->leda = new QLineEdit(this);
QPushButton* cmde = new QPushButton(this);
laba->setFont( * font);
cmde->setText(tr("終了"));
cmde->setFont( * font);
laba->move(10, 20);
laba->setMinimumSize(laba->sizeHint());
leda->setGeometry(10, 50, 150, 24);
cmde->move(170, 80);
QObject::connect(cmde, SIGNAL(clicked()), this, SLOT(buttonClicked()));
this->resize(300, 130);
this->setCaption("lineedit example");
}
void HelloWidget::buttonClicked(void){
QString s = this->leda->text();
fprintf(stdout, "Accepted Text: %s\n", (char* )(s.local8Bit()));
this->close();
}
int main(int argc, char* argv[]){
QApplication* a = new QApplication(argc, argv);
QTextCodec* codec = QTextCodec::codecForName("eucJP");
a->setDefaultCodec(codec);
HelloWidget* my = new HelloWidget(NULL);
a->setMainWidget(my);
my->show();
return a->exec();
}
/* end. */
|
唯一問題になるのが、Qtでは(何度も先述した通り) 内部文字列がUnicodeなので、ファイルに書き出すなどの場合日本語EUCやシフトJISなどポピュラーな日本語文字コードに変換する必要があることです。 この変換ルーチンもQtに内蔵されていて、 それを使っているのが上のこの部分です。
QString s = this->leda->text(); fprintf(stdout, "Accepted Text: %s\n", (char* )(s.local8Bit())); |
では、コンパイルしてみます。Makefileはこんな感じです。
CC = gcc
CXX = g++
QTDIR = /usr/local/qt
MOC = ${QTDIR}/bin/moc
CFLAGS = -I$(QTDIR)/include -g -O
LDFLAGS = -L$(QTDIR)/lib
LIBS = -lqt
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CFLAGS) -o $@ $<
linee: linee.o moc_linee.o
$(CXX) -o $@ $(LDFLAGS) linee.o moc_linee.o $(LIBS)
moc_linee.cpp : linee.h
$(MOC) -o $@ $<
# end.
|
ちょっとフォントがフニャっていますが、 ちゃんとした固定長の綺麗なフォントも出すことができます。 いずれ差し替えます、ということで。
セクションのサブメニューに戻る
(first uploaded 2000/08/08 last updated 2002/03/21)