/Tests/PolicyScope/

der'> cgit logo index : Qt.git
Qt s a cross-platform application framework that is used for developing application software that can be run on various software and hardware platforms with little or no change in the underlying codebase, while still being a native application with native capabilities and speed.
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-06-10 19:34:57 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-06-10 19:34:57 (GMT)
commite6e06e7ffc7a08368af79e1d2ed442e3c0df936c (patch)
tree731d8c8521a5f859a183fc9443fbf6c286b39389
parent497da277770ccf37e05a7b519afd5206601a7cf1 (diff)
parent9385f050620f14e3c3e4616906cf1999bf166041 (diff)
downloadQt-e6e06e7ffc7a08368af79e1d2ed442e3c0df936c.zip
Qt-e6e06e7ffc7a08368af79e1d2ed442e3c0df936c.tar.gz
Qt-e6e06e7ffc7a08368af79e1d2ed442e3c0df936c.tar.bz2
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-1 into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-1: (42 commits) Replaced redundant "!contains" scopes in "contains(A, B) {...} !contains(A, B) {...}" constructions with "else" Updated leading whitespace to make indentation more consistent Updated project files so it is now possible to use "-system-zlib" configuration option on Windows and Symbian platforms. make postgresql support sensitive to PSQL_LIBS support for cross building Qt for MinGW (win32-g++) on Unix use "win32-g++*" scope to match all MinGW makespecs Demos: Fix compilation with namespace. actually fix namespaced compile Attempt to fix build failure on Linux introduced by 09c6a81109 minor cosmetic improvements designer: add sorting in signal-slot editor window deprecate header files in $$QT_BUILD_TREE/include/Qt syncqt: change tabs to spaces I10n: Update German translations for 4.7.0 Fix a freetype link failure. Fix configure test for DirectFB Split Symbian bearer plugin into three platform specfic plugins Doc: Fixed whitespace in the other configuration file for zh_CN. Doc: Fixed whitespace in the Simplified Chinese doc configuration. Unbreak Linux build when qendian.h is included before qglobal.h ...
Diffstat
-rw-r--r--.gitignore1
-rwxr-xr-xbin/syncqt776
-rwxr-xr-xconfig.tests/unix/compile.test6
-rw-r--r--config.tests/unix/getaddrinfo/getaddrinfotest.cpp7
-rw-r--r--config.tests/unix/iconv/iconv.pro2
-rw-r--r--config.tests/unix/ipv6/ipv6test.cpp5
-rw-r--r--config.tests/unix/odbc/odbc.cpp3
-rw-r--r--config.tests/unix/odbc/odbc.pro3
-rw-r--r--config.tests/unix/psql/psql.pro2
-rw-r--r--config.tests/x11/opengl/opengl.pro3
-rwxr-xr-xconfigure90
-rw-r--r--demos/spectrum/app/mainwidget.h1
-rw-r--r--doc/doc.pri17
-rw-r--r--doc/src/ja_JP/development/designer-manual.qdoc175
-rw-r--r--doc/src/ja_JP/development/qmake-manual.qdoc212
-rw-r--r--doc/src/ja_JP/development/qtestlib.qdoc432
-rw-r--r--doc/src/ja_JP/examples/arrowpad.qdoc248
-rw-r--r--doc/src/ja_JP/examples/hellotr.qdoc200
-rw-r--r--doc/src/ja_JP/examples/trollprint.qdoc286
-rw-r--r--doc/src/ja_JP/getting-started/tutorials.qdoc101
-rw-r--r--doc/src/ja_JP/images/linguist-hellotr_en.pngbin0 -> 4424 bytes
-rw-r--r--doc/src/ja_JP/images/linguist-hellotr_ja.pngbin0 -> 5624 bytes
-rw-r--r--doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc72
-rw-r--r--doc/src/ja_JP/tutorials/addressbook.qdoc1070
-rw-r--r--doc/src/ja_JP/tutorials/widgets-tutorial.qdoc257
-rw-r--r--examples/activeqt/activeqt.pro2
-rw-r--r--examples/ja_JP/linguist/hellotr/hellotr.pro13
-rw-r--r--examples/ja_JP/linguist/hellotr/main.cpp71
-rw-r--r--examples/tutorials/addressbook/part3/addressbook.cpp1
-rw-r--r--examples/tutorials/addressbook/part4/addressbook.cpp1
-rw-r--r--examples/tutorials/addressbook/part5/addressbook.cpp1
-rw-r--r--examples/tutorials/addressbook/part6/addressbook.cpp1
-rw-r--r--examples/tutorials/addressbook/part7/addressbook.cpp1
-rw-r--r--mkspecs/linux-icc/qmake.conf23
-rw-r--r--mkspecs/unsupported/win32-g++-cross/qmake.conf101
-rw-r--r--mkspecs/unsupported/win32-g++-cross/qplatformdefs.h42
-rw-r--r--qmake/generators/metamakefile.cpp11
-rw-r--r--qmake/generators/win32/mingw_make.cpp7
-rw-r--r--qmake/qmake.pri2
-rw-r--r--src/3rdparty/javascriptcore/WebKit.pri2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro2
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.pro4
-rw-r--r--src/3rdparty/webkit/WebKit.pri2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro2
-rw-r--r--src/activeqt/container/container.pro2
-rw-r--r--src/activeqt/control/control.pro4
-rw-r--r--src/corelib/global/qendian.h24
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp10
-rw-r--r--src/corelib/kernel/qeventdispatcher_glib.cpp3
-rw-r--r--src/corelib/tools/tools.pri5
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp9
-rw-r--r--src/gui/image/image.pri14
-rw-r--r--src/gui/image/qpixmap.cpp3
-rw-r--r--src/gui/image/qpixmap_x11.cpp6
-rw-r--r--src/gui/kernel/qapplication.cpp1
-rw-r--r--src/gui/kernel/qgesturemanager.cpp8
-rw-r--r--src/gui/kernel/qstandardgestures.cpp3
-rw-r--r--src/gui/kernel/qwidget.cpp2
-rw-r--r--src/gui/painting/painting.pri9
-rw-r--r--src/gui/styles/qcommonstyle.cpp4
-rw-r--r--src/gui/styles/qgtkstyle.cpp3
-rw-r--r--src/gui/text/qtextoption.cpp10
-rw-r--r--src/gui/text/qtextoption.h2
-rw-r--r--src/gui/text/text.pri2
-rw-r--r--src/network/access/access.pri7
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.mm25
-rw-r--r--src/plugins/bearer/symbian/3_1/3_1.pro4
-rw-r--r--src/plugins/bearer/symbian/3_2/3_2.pro12
-rw-r--r--src/plugins/bearer/symbian/symbian.pri30
-rw-r--r--src/plugins/bearer/symbian/symbian.pro42
-rw-r--r--src/plugins/bearer/symbian/symbian_3/symbian_3.pro14
-rw-r--r--src/plugins/imageformats/jpeg/jpeg.pro7
-rw-r--r--src/plugins/imageformats/mng/mng.pro16
-rw-r--r--src/plugins/imageformats/tiff/tiff.pro21
-rw-r--r--src/plugins/sqldrivers/psql/psql.pro4
-rw-r--r--src/qbase.pri1
-rw-r--r--src/s60installs/qsymbianbearer.qtplugin1
-rw-r--r--src/s60installs/s60installs.pro25
-rw-r--r--src/sql/drivers/drivers.pri20
-rw-r--r--src/svg/svg.pro6
-rw-r--r--src/tools/bootstrap/bootstrap.pri5
-rw-r--r--src/tools/bootstrap/bootstrap.pro4
-rw-r--r--src/winmain/winmain.pro4
-rw-r--r--tests/auto/gestures/tst_gestures.cpp66
-rw-r--r--tests/auto/qapplication/tst_qapplication.cpp19
-rw-r--r--tests/auto/qprocess/testProcessEOF/testProcessEOF.pro2
-rw-r--r--tests/auto/qsqldriver/qsqldriver.pro2
-rw-r--r--tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro2
-rw-r--r--tests/auto/qtcpserver/crashingServer/crashingServer.pro2
-rw-r--r--tests/auto/qtextformat/tst_qtextformat.cpp5
-rw-r--r--tests/auto/qtextlayout/tst_qtextlayout.cpp9
-rw-r--r--tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp9
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp6
-rw-r--r--tests/auto/xmlpatternsxqts/tst_suitetest.cpp4
-rw-r--r--tools/activeqt/testcon/testcon.pro2
-rw-r--r--tools/assistant/lib/fulltextsearch/fulltextsearch.pro2
-rw-r--r--tools/configure/configure.pro2
-rw-r--r--tools/configure/configureapp.cpp4
-rw-r--r--tools/configure/configureapp.h1
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp10
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditorwindow.h2
-rw-r--r--tools/qdoc3/test/qt-api-only_ja_JP.qdocconf30
-rw-r--r--tools/qdoc3/test/qt-build-docs.qdocconf1
-rw-r--r--tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf110
-rw-r--r--tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf53
-rw-r--r--tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf178
-rw-r--r--tools/qdoc3/test/qt.qdocconf1
-rw-r--r--tools/qdoc3/test/qt_ja_JP.qdocconf125
-rw-r--r--tools/qdoc3/test/qt_zh_CN.qdocconf45
-rwxr-xr-xtranslations/check-ts.pl85
-rw-r--r--translations/check-ts.xq3
-rw-r--r--translations/qt_de.ts477
-rw-r--r--translations/qt_ja.ts (renamed from translations/qt_ja_JP.ts)0
-rw-r--r--translations/translations.pri7
114 files changed, 5026 insertions, 868 deletions
diff --git a/.gitignore b/.gitignore
index d88e69a..f187b23 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ examples/*/*/*
!examples/*/*/README
examples/*/*/*[.]app
!examples/declarative/*
+!examples/ja_JP/*/*
demos/*/*
!demos/spectrum/*
demos/spectrum/bin
diff --git a/bin/syncqt b/bin/syncqt
index 71f2eab..f499bbc 100755
--- a/bin/syncqt
+++ b/bin/syncqt
@@ -146,12 +146,12 @@ sub shouldMasterInclude {
return 0 if(basename($iheader) =~ /qconfig/);
if(open(F, "<$iheader")) {
while(<F>) {
- chomp;
- return 0 if(/^\#pragma qt_no_master_include$/);
- }
- close(F);
+ chomp;
+ return 0 if(/^\#pragma qt_no_master_include$/);
+ }
+ close(F);
} else {
- return 0;
+ return 0;
}
return 1;
}
@@ -168,17 +168,17 @@ sub classNames {
my @ret;
my ($iheader) = @_;
if(basename($iheader) eq "qglobal.h") {
- push @ret, "QtGlobal";
+ push @ret, "QtGlobal";
} elsif(basename($iheader) eq "qendian.h") {
- push @ret, "QtEndian";
+ push @ret, "QtEndian";
} elsif(basename($iheader) eq "qconfig.h") {
push @ret, "QtConfig";
} elsif(basename($iheader) eq "qplugin.h") {
- push @ret, "QtPlugin";
+ push @ret, "QtPlugin";
} elsif(basename($iheader) eq "qalgorithms.h") {
- push @ret, "QtAlgorithms";
+ push @ret, "QtAlgorithms";
} elsif(basename($iheader) eq "qcontainerfwd.h") {
- push @ret, "QtContainerFwd";
+ push @ret, "QtContainerFwd";
} elsif(basename($iheader) eq "qdebug.h") {
push @ret, "QtDebug";
} elsif(basename($iheader) eq "qevent.h") {
@@ -186,7 +186,7 @@ sub classNames {
} elsif(basename($iheader) eq "qnamespace.h") {
push @ret, "Qt"
} elsif(basename($iheader) eq "qssl.h") {
- push @ret, "QSsl";
+ push @ret, "QSsl";
} elsif(basename($iheader) eq "qtest.h") {
push @ret, "QTest"
} elsif(basename($iheader) eq "qtconcurrentmap.h") {
@@ -204,7 +204,7 @@ sub classNames {
while(<F>) {
my $line = $_;
chomp $line;
- chop $line if ($line =~ /\r$/);
+ chop $line if ($line =~ /\r$/);
if($line =~ /^\#/) {
if($line =~ /\\$/) {
while($line = <F>) {
@@ -212,18 +212,18 @@ sub classNames {
last unless($line =~ /\\$/);
}
}
- return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
+ return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
push(@ret, "$1") if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/);
- $line = 0;
+ $line = 0;
}
- if($line) {
+ if($line) {
$line =~ s,//.*$,,; #remove c++ comments
- $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro
- $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
- $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE[\r\n]*$/); #qt macro
- $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
+ $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
$parsable .= " " . $line;
- }
+ }
}
close(F);
}
@@ -259,7 +259,7 @@ sub classNames {
$i = $i2 if($end eq ";");
$last_definition = $i + 1;
last BLOCK;
- }
+ }
}
}
}
@@ -267,42 +267,42 @@ sub classNames {
} elsif($character eq ";") {
$definition = substr($parsable, $last_definition, $i - $last_definition + 1);
$last_definition = $i + 1;
- } elsif($character eq "}") {
- # a naked } must be a namespace ending
- # if it's not a namespace, it's eaten by the loop above
- pop @namespaces;
- $last_definition = $i + 1;
- }
+ } elsif($character eq "}") {
+ # a naked } must be a namespace ending
+ # if it's not a namespace, it's eaten by the loop above
+ pop @namespaces;
+ $last_definition = $i + 1;
+ }
- if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) /
- && substr($parsable, $i+1, 1) eq "{") {
- push @namespaces, $1;
+ if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) /
+ && substr($parsable, $i+1, 1) eq "{") {
+ push @namespaces, $1;
- # Eat the opening { so that the condensing loop above doesn't see it
- $i++;
- $last_definition = $i + 1;
- }
+ # Eat the opening { so that the condensing loop above doesn't see it
+ $i++;
+ $last_definition = $i + 1;
+ }
if($definition) {
- $definition =~ s=[\n\r]==g;
+ $definition =~ s=[\n\r]==g;
my @symbols;
if($definition =~ m/^ *typedef *.*\(\*([^\)]*)\)\(.*\);$/) {
- push @symbols, $1;
+ push @symbols, $1;
} elsif($definition =~ m/^ *typedef +(.*) +([^ ]*);$/) {
- push @symbols, $2;
+ push @symbols, $2;
} elsif($definition =~ m/^ *(template *<.*> *)?(class|struct) +([^ ]* +)?([^<\s]+) ?(<[^>]*> ?)?\s*((,|:)\s*(public|protected|private) *.*)? *\{\}$/) {
- push @symbols, $4;
+ push @symbols, $4;
} elsif($definition =~ m/^ *Q_DECLARE_.*ITERATOR\((.*)\);$/) {
- push @symbols, "Q" . $1 . "Iterator";
- push @symbols, "QMutable" . $1 . "Iterator";
- }
+ push @symbols, "Q" . $1 . "Iterator";
+ push @symbols, "QMutable" . $1 . "Iterator";
+ }
- foreach (@symbols) {
- my $symbol = $_;
- $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces);
- push @ret, $symbol
- if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q
- || $symbol =~ /^Phonon::/); # or in the Phonon namespace
+ foreach (@symbols) {
+ my $symbol = $_;
+ $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces);
+ push @ret, $symbol
+ if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q
+ || $symbol =~ /^Phonon::/); # or in the Phonon namespace
}
}
}
@@ -453,37 +453,37 @@ sub copyFile
$filecontents = <I>;
close I;
if ( open(I, "< " . $ifile) ) {
- local $/;
- binmode I;
- $ifilecontents = <I>;
- close I;
- $copy = fileCompare($file, $ifile);
- $knowdiff = 0,
+ local $/;
+ binmode I;
+ $ifilecontents = <I>;
+ close I;
+ $copy = fileCompare($file, $ifile);
+ $knowdiff = 0,
} else {
- $copy = -1;
- $knowdiff = 1;
+ $copy = -1;
+ $knowdiff = 1;
}
if ( $knowdiff || ($filecontents ne $ifilecontents) ) {
- if ( $copy > 0 ) {
- my $file_dir = dirname($file);
- mkpath $file_dir, !$quiet unless(-e "$file_dir");
- open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)";
- local $/;
- binmode O;
- print O $ifilecontents;
- close O;
- return 1;
- } elsif ( $copy < 0 ) {
- my $ifile_dir = dirname($ifile);
- mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir");
- open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
- local $/;
- binmode O;
- print O $filecontents;
- close O;
- return 1;
- }
+ if ( $copy > 0 ) {
+ my $file_dir = dirname($file);
+ mkpath $file_dir, !$quiet unless(-e "$file_dir");
+ open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)";
+ local $/;
+ binmode O;
+ print O $ifilecontents;
+ close O;
+ return 1;
+ } elsif ( $copy < 0 ) {
+ my $ifile_dir = dirname($ifile);
+ mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir");
+ open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
+ local $/;
+ binmode O;
+ print O $filecontents;
+ close O;
+ return 1;
+ }
}
return 0;
}
@@ -568,37 +568,37 @@ while ( @ARGV ) {
#parse
my $arg = shift @ARGV;
if ("$arg" eq "-h" || "$arg" eq "-help" || "$arg" eq "?") {
- $var = "show_help";
- $val = "yes";
+ $var = "show_help";
+ $val = "yes";
} elsif("$arg" eq "-copy") {
- $var = "copy";
- $val = "yes";
+ $var = "copy";
+ $val = "yes";
} elsif("$arg" eq "-o" || "$arg" eq "-outdir") {
- $var = "output";
- $val = shift @ARGV;
+ $var = "output";
+ $val = shift @ARGV;
} elsif("$arg" eq "-showonly" || "$arg" eq "-remove-stale" || "$arg" eq "-windows" ||
- "$arg" eq "-relative" || "$arg" eq "-check-includes") {
- $var = substr($arg, 1);
- $val = "yes";
+ "$arg" eq "-relative" || "$arg" eq "-check-includes") {
+ $var = substr($arg, 1);
+ $val = "yes";
} elsif("$arg" =~ /^-no-(.*)$/) {
- $var = $1;
- $val = "no";
- #these are for commandline compat
+ $var = $1;
+ $val = "no";
+ #these are for commandline compat
} elsif("$arg" eq "-inc") {
- $var = "output";
- $val = shift @ARGV;
+ $var = "output";
+ $val = shift @ARGV;
} elsif("$arg" eq "-module") {
- $var = "module";
- $val = shift @ARGV;
+ $var = "module";
+ $val = shift @ARGV;
} elsif("$arg" eq "-separate-module") {
- $var = "separate-module";
- $val = shift @ARGV;
+ $var = "separate-module";
+ $val = shift @ARGV;
} elsif("$arg" eq "-show") {
- $var = "showonly";
- $val = "yes";
+ $var = "showonly";
+ $val = "yes";
} elsif("$arg" eq "-quiet") {
- $var = "quiet";
- $val = "yes";
+ $var = "quiet";
+ $val = "yes";
} elsif("$arg" eq "-base-dir") {
# skip, it's been dealt with at the top of the file
shift @ARGV;
@@ -607,54 +607,54 @@ while ( @ARGV ) {
#do something
if(!$var || "$var" eq "show_help") {
- print "Unknown option: $arg\n\n" if(!$var);
- showUsage();
+ print "Unknown option: $arg\n\n" if(!$var);
+ showUsage();
} elsif ("$var" eq "copy") {
- if("$val" eq "yes") {
- $copy_headers++;
- } elsif($showonly) {
- $copy_headers--;
- }
+ if("$val" eq "yes") {
+ $copy_headers++;
+ } elsif($showonly) {
+ $copy_headers--;
+ }
} elsif ("$var" eq "showonly") {
- if("$val" eq "yes") {
- $showonly++;
- } elsif($showonly) {
- $showonly--;
- }
+ if("$val" eq "yes") {
+ $showonly++;
+ } elsif($showonly) {
+ $showonly--;
+ }
} elsif ("$var" eq "quiet") {
- if("$val" eq "yes") {
- $quiet++;
- } elsif($quiet) {
- $quiet--;
- }
+ if("$val" eq "yes") {
+ $quiet++;
+ } elsif($quiet) {
+ $quiet--;
+ }
} elsif ("$var" eq "check-includes") {
- if("$val" eq "yes") {
- $check_includes++;
- } elsif($check_includes) {
- $check_includes--;
- }
+ if("$val" eq "yes") {
+ $check_includes++;
+ } elsif($check_includes) {
+ $check_includes--;
+ }
} elsif ("$var" eq "remove-stale") {
- if("$val" eq "yes") {
- $remove_stale++;
- } elsif($remove_stale) {
- $remove_stale--;
- }
+ if("$val" eq "yes") {
+ $remove_stale++;
+ } elsif($remove_stale) {
+ $remove_stale--;
+ }
} elsif ("$var" eq "windows") {
- if("$val" eq "yes") {
- $force_win++;
- } elsif($force_win) {
- $force_win--;
- }
+ if("$val" eq "yes") {
+ $force_win++;
+ } elsif($force_win) {
+ $force_win--;
+ }
} elsif ("$var" eq "relative") {
- if("$val" eq "yes") {
- $force_relative++;
- } elsif($force_relative) {
- $force_relative--;
- }
+ if("$val" eq "yes") {
+ $force_relative++;
+ } elsif($force_relative) {
+ $force_relative--;
+ }
} elsif ("$var" eq "module") {
- print "module :$val:\n" unless $quiet;
- die "No such module: $val" unless(defined $modules{$val});
- push @modules_to_sync, $val;
+ print "module :$val:\n" unless $quiet;
+ die "No such module: $val" unless(defined $modules{$val});
+ push @modules_to_sync, $val;
} elsif ("$var" eq "separate-module") {
my ($module, $prodir, $headerdir) = split(/:/, $val);
$modules{$module} = $prodir;
@@ -663,16 +663,16 @@ while ( @ARGV ) {
$create_uic_class_map = 0;
$create_private_headers = 0;
} elsif ("$var" eq "output") {
- my $outdir = $val;
- if(checkRelative($outdir)) {
- $out_basedir = getcwd();
- chomp $out_basedir;
- $out_basedir .= "/" . $outdir;
- } else {
- $out_basedir = $outdir;
- }
- # \ -> /
- $out_basedir =~ s=\\=/=g;
+ my $outdir = $val;
+ if(checkRelative($outdir)) {
+ $out_basedir = getcwd();
+ chomp $out_basedir;
+ $out_basedir .= "/" . $outdir;
+ } else {
+ $out_basedir = $outdir;
+ }
+ # \ -> /
+ $out_basedir =~ s=\\=/=g;
}
}
@modules_to_sync = keys(%modules) if($#modules_to_sync == -1);
@@ -681,6 +681,7 @@ $isunix = checkUnix; #cache checkUnix
# create path
mkpath "$out_basedir/include", !$quiet;
+mkpath "$out_basedir/include/Qt", !$quiet;
my @ignore_headers = ();
my $class_lib_map_contents = "";
@@ -689,6 +690,7 @@ my @ignore_for_include_check = ( "qatomic.h" );
my @ignore_for_qt_begin_header_check = ( "qiconset.h", "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qt_windows.h" );
my @ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h" );
my @ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtSql}/drivers", "$modules{QtTest}", "$modules{QtDesigner}", "$modules{QtUiTools}", "$modules{QtDBus}", "$modules{phonon}" );
+my %colliding_headers = ();
foreach (@modules_to_sync) {
#iteration info
@@ -708,77 +710,77 @@ foreach (@modules_to_sync) {
#get dependencies
if(-e "$dir/" . basename($dir) . ".pro") {
- if(open(F, "<$dir/" . basename($dir) . ".pro")) {
- while(<F>) {
- my $line = $_;
- chomp $line;
- if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
- foreach(split(/ /, "$1")) {
- $master_contents .= "#include <QtCore/QtCore>\n" if("$_" eq "core");
- $master_contents .= "#include <QtGui/QtGui>\n" if("$_" eq "gui");
- $master_contents .= "#include <QtNetwork/QtNetwork>\n" if("$_" eq "network");
- $master_contents .= "#include <QtSvg/QtSvg>\n" if("$_" eq "svg");
- $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if("$_" eq "declarative");
- $master_contents .= "#include <QtScript/QtScript>\n" if("$_" eq "script");
- $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if("$_" eq "scripttools");
- $master_contents .= "#include <Qt3Support/Qt3Support>\n" if("$_" eq "qt3support");
- $master_contents .= "#include <QtSql/QtSql>\n" if("$_" eq "sql");
- $master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml");
- $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns");
- $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl");
- $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg");
- }
- }
- }
- close(F);
- }
+ if(open(F, "<$dir/" . basename($dir) . ".pro")) {
+ while(<F>) {
+ my $line = $_;
+ chomp $line;
+ if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
+ foreach(split(/ /, "$1")) {
+ $master_contents .= "#include <QtCore/QtCore>\n" if("$_" eq "core");
+ $master_contents .= "#include <QtGui/QtGui>\n" if("$_" eq "gui");
+ $master_contents .= "#include <QtNetwork/QtNetwork>\n" if("$_" eq "network");
+ $master_contents .= "#include <QtSvg/QtSvg>\n" if("$_" eq "svg");
+ $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if("$_" eq "declarative");
+ $master_contents .= "#include <QtScript/QtScript>\n" if("$_" eq "script");
+ $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if("$_" eq "scripttools");
+ $master_contents .= "#include <Qt3Support/Qt3Support>\n" if("$_" eq "qt3support");
+ $master_contents .= "#include <QtSql/QtSql>\n" if("$_" eq "sql");
+ $master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml");
+ $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns");
+ $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl");
+ $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg");
+ }
+ }
+ }
+ close(F);
+ }
}
#remove the old files
if($remove_stale) {
- my @subdirs = ("$out_basedir/include/$lib");
- foreach (@subdirs) {
- my $subdir = "$_";
- if (opendir DIR, "$subdir") {
- while(my $t = readdir(DIR)) {
- my $file = "$subdir/$t";
- if(-d "$file") {
- push @subdirs, "$file" unless($t eq "." || $t eq "..");
- } else {
- my @files = ("$file");
- #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
- foreach (@files) {
- my $file = $_;
- my $remove_file = 0;
- if(open(F, "<$file")) {
- while(<F>) {
- my $line = $_;
- chomp $line;
- if($line =~ /^\#include \"([^\"]*)\"$/) {
- my $include = $1;
- $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
- $remove_file = 1 unless(-e "$include");
- } else {
- $remove_file = 0;
- last;
- }
- }
- close(F);
- unlink "$file" if($remove_file);
- }
- }
- }
- }
- closedir DIR;
+ my @subdirs = ("$out_basedir/include/$lib");
+ foreach (@subdirs) {
+ my $subdir = "$_";
+ if (opendir DIR, "$subdir") {
+ while(my $t = readdir(DIR)) {
+ my $file = "$subdir/$t";
+ if(-d "$file") {
+ push @subdirs, "$file" unless($t eq "." || $t eq "..");
+ } else {
+ my @files = ("$file");
+ #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
+ foreach (@files) {
+ my $file = $_;
+ my $remove_file = 0;
+ if(open(F, "<$file")) {
+ while(<F>) {
+ my $line = $_;
+ chomp $line;
+ if($line =~ /^\#include \"([^\"]*)\"$/) {
+ my $include = $1;
+ $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
+ $remove_file = 1 unless(-e "$include");
+ } else {
+ $remove_file = 0;
+ last;
+ }
+ }
+ close(F);
+ unlink "$file" if($remove_file);
+ }
+ }
+ }
+ }
+ closedir DIR;
}
- }
+ }
}
#create the new ones
foreach (split(/;/, $dir)) {
- my $current_dir = "$_";
- my $headers_dir = $current_dir;
+ my $current_dir = "$_";
+ my $headers_dir = $current_dir;
$headers_dir .= "/$pathtoheaders" if ($pathtoheaders);
#calc subdirs
my @subdirs = ($headers_dir);
@@ -787,7 +789,7 @@ foreach (@modules_to_sync) {
opendir DIR, "$subdir" or next;
while(my $t = readdir(DIR)) {
push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
- !($t eq "..") && !($t eq ".obj") &&
+ !($t eq "..") && !($t eq ".obj") &&
!($t eq ".moc") && !($t eq ".rcc") &&
!($t eq ".uic") && !($t eq "build"));
}
@@ -805,85 +807,105 @@ foreach (@modules_to_sync) {
$header = 0 if("$header" eq "$_");
}
if($header) {
- my $header_copies = 0;
- #figure out if it is a public header
- my $public_header = $header;
- if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
- $public_header = 0;
- } else {
- foreach (@ignore_for_master_contents) {
- $public_header = 0 if("$header" eq "$_");
- }
- }
+ my $header_copies = 0;
+ #figure out if it is a public header
+ my $public_header = $header;
+ if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
+ $public_header = 0;
+ } else {
+ foreach (@ignore_for_master_contents) {
+ $public_header = 0 if("$header" eq "$_");
+ }
+ }
my $iheader = $subdir . "/" . $header;
- my @classes = $public_header ? classNames($iheader) : ();
+ my @classes = $public_header ? classNames($iheader) : ();
if($showonly) {
print "$header [$lib]\n";
- foreach(@classes) {
- print "SYMBOL: $_\n";
- }
+ foreach(@classes) {
+ print "SYMBOL: $_\n";
+ }
} else {
- #find out all the places it goes..
- my @headers;
- if ($public_header) {
- @headers = ( "$out_basedir/include/$lib/$header" );
- push @headers, "$out_basedir/include/Qt/$header"
- if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/);
+ #find out all the places it goes..
+ my @headers;
+ if ($public_header) {
+ @headers = ( "$out_basedir/include/$lib/$header" );
+
+ # write forwarding headers to include/Qt
+ if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/) {
+ my $file_name = "$out_basedir/include/Qt/$header";
+ my $header_content = '';
+ if (exists $colliding_headers{$file_name}) {
+ $file_name = ">>$file_name";
+ } else {
+ $colliding_headers{$file_name} = 1;
+ $file_name = ">$file_name";
+ my $warning_msg = 'Inclusion of header files from include/Qt is deprecated.';
+ $header_content = "#ifndef QT_NO_QT_INCLUDE_WARN\n" .
+ " #if defined(__GNUC__)\n" .
+ " #pragma warning \"$warning_msg\"\n" .
+ " #elif defined(_MSC_VER)\n" .
+ " #pragma message \"WARNING: $warning_msg\"\n" .
+ " #endif\n".
+ "#endif\n\n";
+ }
+ $header_content .= '#include "' . "../$lib/$header" . "\"\n";
+ open HEADERFILE, $file_name;
+ print HEADERFILE $header_content;
+ close HEADERFILE;
+ }
- foreach(@classes) {
- my $header_base = basename($header);
- my $class = $_;
- # Strip namespaces:
- $class =~ s/^.*:://;
-# if ($class =~ m/::/) {
-# class =~ s,::,/,g;
-# }
- $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n";
- $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0));
+ foreach(@classes) {
+ my $header_base = basename($header);
+ my $class = $_;
+ # Strip namespaces:
+ $class =~ s/^.*:://;
+# if ($class =~ m/::/) {
+# class =~ s,::,/,g;
+# }
+ $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n";
+ $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0));
- # KDE-Compat headers for Phonon
- if ($lib eq "phonon") {
- $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0));
- }
- }
- } elsif ($create_private_headers) {
- @headers = ( "$out_basedir/include/$lib/private/$header" );
- push @headers, "$out_basedir/include/Qt/private/$header"
- if ("$lib" ne "phonon");
- }
- foreach(@headers) { #sync them
- $header_copies++ if(syncHeader($_, $iheader, $copy_headers));
- }
+ # KDE-Compat headers for Phonon
+ if ($lib eq "phonon") {
+ $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0));
+ }
+ }
+ } elsif ($create_private_headers) {
+ @headers = ( "$out_basedir/include/$lib/private/$header" );
+ }
+ foreach(@headers) { #sync them
+ $header_copies++ if(syncHeader($_, $iheader, $copy_headers));
+ }
- if($public_header) {
- #put it into the master file
- $master_contents .= "#include \"$public_header\"\n" if(shouldMasterInclude($iheader));
+ if($public_header) {
+ #put it into the master file
+ $master_contents .= "#include \"$public_header\"\n" if(shouldMasterInclude($iheader));
- #deal with the install directives
- if($public_header) {
- my $pri_install_iheader = fixPaths($iheader, $current_dir);
- foreach(@classes) {
- my $class = $_;
- # Strip namespaces:
- $class =~ s/^.*:://;
-# if ($class =~ m/::/) {
-# $class =~ s,::,/,g;
-# }
- my $class_header = fixPaths("$out_basedir/include/$lib/$class",
- $current_dir) . " ";
- $pri_install_classes .= $class_header
- unless($pri_install_classes =~ $class_header);
- }
- $pri_install_files.= "$pri_install_iheader ";;
- }
- }
- else {
- my $pri_install_iheader = fixPaths($iheader, $current_dir);
- $pri_install_pfiles.= "$pri_install_iheader ";;
- }
+ #deal with the install directives
+ if($public_header) {
+ my $pri_install_iheader = fixPaths($iheader, $current_dir);
+ foreach(@classes) {
+ my $class = $_;
+ # Strip namespaces:
+ $class =~ s/^.*:://;
+# if ($class =~ m/::/) {
+# $class =~ s,::,/,g;
+# }
+ my $class_header = fixPaths("$out_basedir/include/$lib/$class",
+ $current_dir) . " ";
+ $pri_install_classes .= $class_header
+ unless($pri_install_classes =~ $class_header);
+ }
+ $pri_install_files.= "$pri_install_iheader ";;
+ }
+ }
+ else {
+ my $pri_install_iheader = fixPaths($iheader, $current_dir);
+ $pri_install_pfiles.= "$pri_install_iheader ";;
+ }
}
- print "header created for $iheader ($header_copies)\n" if($header_copies > 0 && !$quiet);
+ print "header created for $iheader ($header_copies)\n" if($header_copies > 0 && !$quiet);
}
}
}
@@ -894,8 +916,8 @@ foreach (@modules_to_sync) {
unless($showonly) {
my @master_includes;
- push @master_includes, "$out_basedir/include/$lib/$lib";
- push @master_includes, "$out_basedir/include/phonon_compat/Phonon/Phonon" if ($lib eq "phonon");
+ push @master_includes, "$out_basedir/include/$lib/$lib";
+ push @master_includes, "$out_basedir/include/phonon_compat/Phonon/Phonon" if ($lib eq "phonon");
foreach my $master_include (@master_includes) {
#generate the "master" include file
my @tmp = split(/;/,$modules{$lib});
@@ -920,10 +942,10 @@ foreach (@modules_to_sync) {
}
#handle the headers.pri for each module
- my $headers_pri_contents = "";
- $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n";
- $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n";
- $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n";
+ my $headers_pri_contents = "";
+ $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n";
+ $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n";
+ $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n";
my $headers_pri_file = "$out_basedir/include/$lib/headers.pri";
if(-e "$headers_pri_file") {
open HEADERS_PRI_FILE, "<$headers_pri_file";
@@ -947,125 +969,125 @@ foreach (@modules_to_sync) {
unless($showonly || !$create_uic_class_map) {
my $class_lib_map = "$out_basedir/src/tools/uic/qclass_lib_map.h";
if(-e "$class_lib_map") {
- open CLASS_LIB_MAP, "<$class_lib_map";
- local $/;
- binmode CLASS_LIB_MAP;
- my $old_class_lib_map_contents = <CLASS_LIB_MAP>;
- close CLASS_LIB_MAP;
- $old_class_lib_map_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
- $class_lib_map = 0 if($old_class_lib_map_contents eq $class_lib_map_contents);
+ open CLASS_LIB_MAP, "<$class_lib_map";
+ local $/;
+ binmode CLASS_LIB_MAP;
+ my $old_class_lib_map_contents = <CLASS_LIB_MAP>;
+ close CLASS_LIB_MAP;
+ $old_class_lib_map_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
+ $class_lib_map = 0 if($old_class_lib_map_contents eq $class_lib_map_contents);
}
if($class_lib_map) {
- my $class_lib_map_dir = dirname($class_lib_map);
- mkpath $class_lib_map_dir, !$quiet;
- open CLASS_LIB_MAP, ">$class_lib_map";
- print CLASS_LIB_MAP "$class_lib_map_contents";
- close CLASS_LIB_MAP;
+ my $class_lib_map_dir = dirname($class_lib_map);
+ mkpath $class_lib_map_dir, !$quiet;
+ open CLASS_LIB_MAP, ">$class_lib_map";
+ print CLASS_LIB_MAP "$class_lib_map_contents";
+ close CLASS_LIB_MAP;
}
}
if($check_includes) {
for (keys(%modules)) {
- #iteration info
- my $lib = $_;
- my $dir = "$modules{$lib}";
- foreach (split(/;/, $dir)) {
- my $current_dir = "$_";
- #calc subdirs
- my @subdirs = ($current_dir);
- foreach (@subdirs) {
- my $subdir = "$_";
- opendir DIR, "$subdir";
- while(my $t = readdir(DIR)) {
+ #iteration info
+ my $lib = $_;
+ my $dir = "$modules{$lib}";
+ foreach (split(/;/, $dir)) {
+ my $current_dir = "$_";
+ #calc subdirs
+ my @subdirs = ($current_dir);
+ foreach (@subdirs) {
+ my $subdir = "$_";
+ opendir DIR, "$subdir";
+ while(my $t = readdir(DIR)) {
push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
!($t eq "..") && !($t eq ".obj") &&
!($t eq ".moc") && !($t eq ".rcc") &&
!($t eq ".uic") && !($t eq "build"));
- }
- closedir DIR;
- }
+ }
+ closedir DIR;
+ }
- foreach (@subdirs) {
- my $subdir = "$_";
+ foreach (@subdirs) {
+ my $subdir = "$_";
my $header_skip_qt_module_test = 0;
foreach(@ignore_for_qt_module_check) {
foreach (split(/;/, $_)) {
$header_skip_qt_module_test = 1 if ("$subdir" =~ /^$_/);
}
}
- my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0);
- foreach (@headers) {
- my $header = "$_";
+ my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0);
+ foreach (@headers) {
+ my $header = "$_";
my $header_skip_qt_begin_header_test = 0;
my $header_skip_qt_begin_namespace_test = 0;
- $header = 0 if("$header" =~ /^ui_.*.h/);
- foreach (@ignore_headers) {
- $header = 0 if("$header" eq "$_");
- }
- if($header) {
- my $public_header = $header;
- if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
- $public_header = 0;
- } else {
- foreach (@ignore_for_master_contents) {
- $public_header = 0 if("$header" eq "$_");
- }
- if($public_header) {
- foreach (@ignore_for_include_check) {
- $public_header = 0 if("$header" eq "$_");
- }
+ $header = 0 if("$header" =~ /^ui_.*.h/);
+ foreach (@ignore_headers) {
+ $header = 0 if("$header" eq "$_");
+ }
+ if($header) {
+ my $public_header = $header;
+ if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
+ $public_header = 0;
+ } else {
+ foreach (@ignore_for_master_contents) {
+ $public_header = 0 if("$header" eq "$_");
+ }
+ if($public_header) {
+ foreach (@ignore_for_include_check) {
+ $public_header = 0 if("$header" eq "$_");
+ }
foreach(@ignore_for_qt_begin_header_check) {
$header_skip_qt_begin_header_test = 1 if ("$header" eq "$_");
}
foreach(@ignore_for_qt_begin_namespace_check) {
$header_skip_qt_begin_namespace_test = 1 if ("$header" eq "$_");
}
- }
- }
+ }
+ }
- my $iheader = $subdir . "/" . $header;
- if($public_header) {
- if(open(F, "<$iheader")) {
+ my $iheader = $subdir . "/" . $header;
+ if($public_header) {
+ if(open(F, "<$iheader")) {
my $qt_module_found = 0;
- my $qt_begin_header_found = 0;
- my $qt_end_header_found = 0;
- my $qt_begin_namespace_found = 0;
- my $qt_end_namespace_found = 0;
- my $line;
- while($line = <F>) {
- chomp $line;
- my $output_line = 1;
+ my $qt_begin_header_found = 0;
+ my $qt_end_header_found = 0;
+ my $qt_begin_namespace_found = 0;
+ my $qt_end_namespace_found = 0;
+ my $line;
+ while($line = <F>) {
+ chomp $line;
+ my $output_line = 1;
if($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) {
- last;
- } elsif($line =~ /^ *\# *include/) {
- my $include = $line;
- if($line =~ /<.*>/) {
- $include =~ s,.*<(.*)>.*,$1,;
- } elsif($line =~ /".*"/) {
- $include =~ s,.*"(.*)".*,$1,;
- } else {
- $include = 0;
- }
- if($include) {
- for (keys(%modules)) {
- my $trylib = $_;
- if(-e "$out_basedir/include/$trylib/$include") {
- print "WARNING: $iheader includes $include when it should include $trylib/$include\n";
- }
- }
- }
- } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_BEGIN_HEADER\s*$/) {
- $qt_begin_header_found = 1;
- } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_END_HEADER\s*$/) {
- $qt_end_header_found = 1;
- } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE\s*$/) {
- $qt_begin_namespace_found = 1;
- } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE\s*$/) {
- $qt_end_namespace_found = 1;
+ last;
+ } elsif($line =~ /^ *\# *include/) {
+ my $include = $line;
+ if($line =~ /<.*>/) {
+ $include =~ s,.*<(.*)>.*,$1,;
+ } elsif($line =~ /".*"/) {
+ $include =~ s,.*"(.*)".*,$1,;
+ } else {
+ $include = 0;
+ }
+ if($include) {
+ for (keys(%modules)) {
+ my $trylib = $_;
+ if(-e "$out_basedir/include/$trylib/$include") {
+ print "WARNING: $iheader includes $include when it should include $trylib/$include\n";
+ }
+ }
+ }
+ } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_BEGIN_HEADER\s*$/) {
+ $qt_begin_header_found = 1;
+ } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_END_HEADER\s*$/) {
+ $qt_end_header_found = 1;
+ } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE\s*$/) {
+ $qt_begin_namespace_found = 1;
+ } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE\s*$/) {
+ $qt_end_namespace_found = 1;
} elsif ($header_skip_qt_module_test == 0 and $line =~ /^QT_MODULE\(.*\)\s*$/) {
$qt_module_found = 1;
}
- }
+ }
if ($header_skip_qt_begin_header_test == 0) {
if ($qt_begin_header_found == 0) {
print "WARNING: $iheader does not include QT_BEGIN_HEADER\n";
@@ -1091,13 +1113,13 @@ if($check_includes) {
print "WARNING: $iheader does not include QT_MODULE\n";
}
}
- close(F);
- }
- }
- }
- }
- }
- }
+ close(F);
+ }
+ }
+ }
+ }
+ }
+ }
}
}
diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test
index 67a4636..99ebfd2 100755
--- a/config.tests/unix/compile.test
+++ b/config.tests/unix/compile.test
@@ -65,8 +65,10 @@ test -d "$OUTDIR/$TEST" || mkdir -p "$OUTDIR/$TEST"
cd "$OUTDIR/$TEST"
test -r Makefile && $MAKE distclean >/dev/null 2>&1
+# Make sure output from possible previous tests is gone
+rm -f "$EXE" "${EXE}.exe"
-"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
+"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG-=debug_and_release" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
if [ "$VERBOSE" = "yes" ]; then
$MAKE
@@ -74,7 +76,7 @@ else
$MAKE >/dev/null 2>&1
fi
-[ -x "$EXE" ] && SUCCESS=yes
+( [ -x "$EXE" ] || [ -x "${EXE}.exe" ] ) && SUCCESS=yes
# done
if [ "$SUCCESS" != "yes" ]; then
diff --git a/config.tests/unix/getaddrinfo/getaddrinfotest.cpp b/config.tests/unix/getaddrinfo/getaddrinfotest.cpp
index 0c482cc..df6ae10 100644
--- a/config.tests/unix/getaddrinfo/getaddrinfotest.cpp
+++ b/config.tests/unix/getaddrinfo/getaddrinfotest.cpp
@@ -42,9 +42,16 @@
/* Sample program for configure to test for getaddrinfo on the unix
platform. we check for all structures and functions required. */
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef __MINGW32__
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
+#endif
int main()
{
diff --git a/config.tests/unix/iconv/iconv.pro b/config.tests/unix/iconv/iconv.pro
index 8cdc776..d642da2 100644
--- a/config.tests/unix/iconv/iconv.pro
+++ b/config.tests/unix/iconv/iconv.pro
@@ -1,3 +1,3 @@
SOURCES = iconv.cpp
CONFIG -= qt dylib app_bundle
-mac:LIBS += -liconv
+mac|win32-g++*:LIBS += -liconv
diff --git a/config.tests/unix/ipv6/ipv6test.cpp b/config.tests/unix/ipv6/ipv6test.cpp
index 4fb27f2..4243f2d 100644
--- a/config.tests/unix/ipv6/ipv6test.cpp
+++ b/config.tests/unix/ipv6/ipv6test.cpp
@@ -46,9 +46,14 @@ platforms. We check for the required IPv6 data structures. */
#define _HPUX_SOURCE
#endif
+#ifdef __MINGW32__
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#endif
int main()
{
diff --git a/config.tests/unix/odbc/odbc.cpp b/config.tests/unix/odbc/odbc.cpp
index 32602c0..98f3571 100644
--- a/config.tests/unix/odbc/odbc.cpp
+++ b/config.tests/unix/odbc/odbc.cpp
@@ -39,6 +39,9 @@
**
****************************************************************************/
+#ifdef __MINGW32__
+#include <windows.h>
+#endif
#include <sql.h>
#include <sqlext.h>
diff --git a/config.tests/unix/odbc/odbc.pro b/config.tests/unix/odbc/odbc.pro
index c588ede..06a548f 100644
--- a/config.tests/unix/odbc/odbc.pro
+++ b/config.tests/unix/odbc/odbc.pro
@@ -1,4 +1,5 @@
SOURCES = odbc.cpp
CONFIG -= qt dylib
mac:CONFIG -= app_bundle
-LIBS += -lodbc
+win32-g++*:LIBS += -lodbc32
+else:LIBS += -lodbc
diff --git a/config.tests/unix/psql/psql.pro b/config.tests/unix/psql/psql.pro
index 64bb3d6..38bfb3e 100644
--- a/config.tests/unix/psql/psql.pro
+++ b/config.tests/unix/psql/psql.pro
@@ -1,4 +1,4 @@
SOURCES = psql.cpp
CONFIG -= qt dylib
mac:CONFIG -= app_bundle
-LIBS += -lpq
+LIBS *= -lpq
diff --git a/config.tests/x11/opengl/opengl.pro b/config.tests/x11/opengl/opengl.pro
index 432bd8d..5fd41d3 100644
--- a/config.tests/x11/opengl/opengl.pro
+++ b/config.tests/x11/opengl/opengl.pro
@@ -7,4 +7,5 @@ for(p, QMAKE_LIBDIR_OPENGL) {
}
CONFIG -= qt
-LIBS += -lGL -lGLU
+win32-g++*:LIBS += -lopengl32
+else:LIBS += -lGL -lGLU
diff --git a/configure b/configure
index 89cd97d..f61ac6c 100755
--- a/configure
+++ b/configure
@@ -779,6 +779,7 @@ RPATH_FLAGS=
l_FLAGS=
QCONFIG_FLAGS=
XPLATFORM= # This seems to be the QMAKESPEC, like "linux-g++" or "symbian/linux-gcce"
+XPLATFORM_MINGW=no # Whether target platform is MinGW (win32-g++*)
PLATFORM=$QMAKESPEC
QT_CROSS_COMPILE=no
OPT_CONFIRM_LICENSE=no
@@ -1326,7 +1327,9 @@ while [ "$#" -gt 0 ]; do
fi
;;
arch)
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ # if this is a Mac then "windows" probably means
+ # we are cross-compiling for MinGW
+ if [ "$PLATFORM_MAC" = "yes" ] && [ "$VAL" != "windows" ]; then
CFG_MAC_ARCHS="$CFG_MAC_ARCHS $VAL"
else
CFG_ARCH=$VAL
@@ -1444,6 +1447,7 @@ while [ "$#" -gt 0 ]; do
;;
xplatform)
XPLATFORM="$VAL"
+ case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac
;;
debug-and-release)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
@@ -2578,9 +2582,13 @@ if [ -z "$PLATFORM" ]; then
"
;;
SunOS:5*)
- #PLATFORM=solaris-g++
- PLATFORM=solaris-cc
- #PLATFORM=solaris-cc64
+ if [ "$XPLATFORM_MINGW" = "yes" ]; then
+ PLATFORM="solaris-g++"
+ else
+ #PLATFORM=solaris-g++
+ PLATFORM=solaris-cc
+ #PLATFORM=solaris-cc64
+ fi
PLATFORM_NOTES="
- Also available for Solaris: solaris-g++ solaris-cc-64
"
@@ -2650,6 +2658,9 @@ else
fi
[ -z "$XPLATFORM" ] && XPLATFORM="$PLATFORM"
+
+case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac
+
if [ -d "$PLATFORM" ]; then
QMAKESPEC="$PLATFORM"
else
@@ -2922,6 +2933,8 @@ if [ "$PLATFORM" != "$XPLATFORM" -a "$CFG_EMBEDDED" != "no" ]; then
CFG_ARCH="$CFG_EMBEDDED"
;;
esac
+elif [ "$XPLATFORM_MINGW" = "yes" ]; then
+ [ -z "$CFG_ARCH" ] && CFG_ARCH="windows"
elif [ "$PLATFORM_MAC" = "yes" ] || [ -z "$CFG_ARCH" ]; then
CFG_ARCH=$CFG_HOST_ARCH
fi
@@ -4087,6 +4100,8 @@ elif [ "$PLATFORM_MAC" = "yes" ]; then
Platform="Qt for Mac OS X"
elif echo "$XPLATFORM" | grep "symbian" > /dev/null ; then
Platform="Qt for Symbian"
+elif [ "$XPLATFORM_MINGW" = "yes" ]; then
+ Platform="Qt for Windows"
elif [ '!' -z "`getQMakeConf \"$XQMAKESPEC\" | grep QMAKE_LIBS_X11 | awk '{print $3;}'`" ]; then
PLATFORM_X11=yes
Platform="Qt for Linux/X11"
@@ -4668,7 +4683,7 @@ if [ "$CFG_IWMMXT" = "yes" ]; then
fi
# detect neon support
-if ([ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ]) && [ "${CFG_NEON}" = "auto" ]; then
+if ( [ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ] ) && [ "${CFG_NEON}" = "auto" ]; then
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/neon "neon" $L_FLAGS $I_FLAGS $l_FLAGS "-mfpu=neon"; then
CFG_NEON=yes
else
@@ -4698,6 +4713,8 @@ if [ "$CFG_ZLIB" = "auto" ]; then
fi
fi
+[ "$XPLATFORM_MINGW" = "yes" ] && QMakeVar add styles "windowsxp windowsvista"
+
case "$XPLATFORM" in *symbian*)
QMakeVar set styles "windows s60" #overwrite previous default
CFG_LIBFREETYPE=no
@@ -4897,12 +4914,15 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
psql)
if [ "$CFG_SQL_psql" != "no" ]; then
- if "$WHICH" pg_config >/dev/null 2>&1; then
+ # Be careful not to use native pg_config when cross building.
+ if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then
QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null`
QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null`
fi
[ -z "$QT_CFLAGS_PSQL" ] || QT_CFLAGS_PSQL="-I$QT_CFLAGS_PSQL"
[ -z "$QT_LFLAGS_PSQL" ] || QT_LFLAGS_PSQL="-L$QT_LFLAGS_PSQL"
+ # But, respect PSQL_LIBS if set
+ [ -z "$PSQL_LIBS" ] || QT_LFLAGS_PSQL="$PSQL_LIBS"
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/psql "PostgreSQL" $QT_LFLAGS_PSQL $L_FLAGS $QT_CFLAGS_PSQL $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_psql" = "auto" ]; then
CFG_SQL_psql=plugin
@@ -4924,7 +4944,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
odbc)
if [ "$CFG_SQL_odbc" != "no" ]; then
- if [ "$PLATFORM_MAC" != "yes" ] && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
+ if ( [ "$PLATFORM_MAC" != "yes" ] || [ "$XPLATFORM_MINGW" = "yes" ] ) && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_odbc" = "auto" ]; then
CFG_SQL_odbc=plugin
fi
@@ -5190,6 +5210,7 @@ if [ "$PLATFORM_MAC" = "yes" -a ! -z "$QT_NAMESPACE" ]; then
QT_NAMESPACE_MAC_CRC=`"$mactests/crc.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/mac/crc $QT_NAMESPACE $L_FLAGS $I_FLAGS $l_FLAGS`
fi
+# X11/QWS
if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then
# auto-detect Glib support
@@ -5354,7 +5375,7 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then
fi
fi # X11/QWS
-# x11
+# X11
if [ "$PLATFORM_X11" = "yes" ]; then
x11tests="$relpath/config.tests/x11"
X11TESTS_FLAGS=
@@ -5375,7 +5396,10 @@ if [ "$PLATFORM_X11" = "yes" ]; then
echo " QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in ${XQMAKESPEC}."
exit 1
fi
+fi
+# X11/MINGW OpenGL
+if [ "$PLATFORM_X11" = "yes" -o "$XPLATFORM_MINGW" = "yes" ]; then
# auto-detect OpenGL support (es1 = OpenGL ES 1.x Common, es2 = OpenGL ES 2.x)
if [ "$CFG_GUI" = "no" ]; then
if [ "$CFG_OPENGL" = "auto" ]; then
@@ -5471,7 +5495,10 @@ if [ "$PLATFORM_X11" = "yes" ]; then
echo "OpenGL Graphics System is disabled due to missing OpenGL support..."
CFG_GRAPHICS_SYSTEM=default
fi
+fi # X11/MINGW OpenGL
+# X11
+if [ "$PLATFORM_X11" = "yes" ]; then
# auto-detect Xcursor support
if [ "$CFG_XCURSOR" != "no" ]; then
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/xcursor "Xcursor" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
@@ -5834,14 +5861,12 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
fi
if [ "${screen}" = "directfb" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then
- if [ -n "$PKG_CONFIG" ]; then
- if $PKG_CONFIG --exists directfb 2>/dev/null; then
- QT_CFLAGS_DIRECTFB=`$PKG_CONFIG --cflags directfb 2>/dev/null`
- QT_LIBS_DIRECTFB=`$PKG_CONFIG --libs directfb 2>/dev/null`
- elif directfb-config --version >/dev/null 2>&1; then
- QT_CFLAGS_DIRECTFB=`directfb-config --cflags 2>/dev/null`
- QT_LIBS_DIRECTFB=`directfb-config --libs 2>/dev/null`
- fi
+ if test -n "$PKG_CONFIG" && "$PKG_CONFIG" --exists directfb 2>/dev/null; then
+ QT_CFLAGS_DIRECTFB=`$PKG_CONFIG --cflags directfb 2>/dev/null`
+ QT_LIBS_DIRECTFB=`$PKG_CONFIG --libs directfb 2>/dev/null`
+ elif directfb-config --version >/dev/null 2>&1; then
+ QT_CFLAGS_DIRECTFB=`directfb-config --cflags 2>/dev/null`
+ QT_LIBS_DIRECTFB=`directfb-config --libs 2>/dev/null`
fi
# QMake variables set here override those in the mkspec. Therefore we only set the variables here if they are not zero.
@@ -5919,9 +5944,12 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then
fi
fi
+[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_PHONON" != "no" ] && CFG_PHONON="yes"
+
# freetype support
[ "x$CFG_EMBEDDED" != "xno" ] && CFG_LIBFREETYPE="$CFG_QWS_FREETYPE"
[ "x$PLATFORM_MAC" = "xyes" ] && CFG_LIBFREETYPE=no
+[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_LIBFREETYPE" = "auto" ] && CFG_LIBFREETYPE=no
if [ "$CFG_LIBFREETYPE" = "auto" ]; then
if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/freetype "FreeType" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBFREETYPE=system
@@ -5931,7 +5959,9 @@ if [ "$CFG_LIBFREETYPE" = "auto" ]; then
fi
if [ "$CFG_ENDIAN" = "auto" ]; then
- if [ "$PLATFORM_MAC" = "yes" ]; then
+ if [ "$XPLATFORM_MINGW" = "yes" ]; then
+ CFG_ENDIAN="Q_LITTLE_ENDIAN"
+ elif [ "$PLATFORM_MAC" = "yes" ]; then
true #leave as auto
elif [ "$XPLATFORM" = "symbian-sbsv2" ]; then
CFG_ENDIAN="Q_LITTLE_ENDIAN"
@@ -6257,6 +6287,11 @@ if [ "$CFG_AUDIO_BACKEND" = "auto" ]; then
fi
fi
+if [ "$CFG_LARGEFILE" != "yes" ] && [ "$XPLATFORM_MINGW" = "yes" ]; then
+ echo "Warning: largefile support cannot be disabled for win32."
+ CFG_LARGEFILE="yes"
+fi
+
#-------------------------------------------------------------------------------
# ask for all that hasn't been auto-detected or specified in the arguments
#-------------------------------------------------------------------------------
@@ -6359,6 +6394,9 @@ if [ "$PLATFORM_MAC" = "yes" ]; then
fi
fi
+# but disable Cocoa if cross-building for mingw
+[ "$XPLATFORM_MINGW" = "yes" ] && CFG_MAC_COCOA="no"
+
# set the global Mac deployment target. This is overridden on an arch-by-arch basis
# in some cases, see code further down
case "$PLATFORM,$CFG_MAC_COCOA" in
@@ -6497,7 +6535,7 @@ QMakeVar set OBJECTS_DIR ".obj/$QMAKE_OUTDIR"
QMakeVar set MOC_DIR ".moc/$QMAKE_OUTDIR"
QMakeVar set RCC_DIR ".rcc/$QMAKE_OUTDIR"
QMakeVar set UI_DIR ".uic/$QMAKE_OUTDIR"
-if [ "$CFG_LARGEFILE" = "yes" ]; then
+if [ "$CFG_LARGEFILE" = "yes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then
QMAKE_CONFIG="$QMAKE_CONFIG largefile"
fi
if [ "$CFG_STL" = "no" ]; then
@@ -6613,7 +6651,7 @@ else
fi
-if [ "x$PLATFORM_MAC" = "xyes" ] && [ "$XPLATFORM" != "win32-g++" ]; then
+if [ "x$PLATFORM_MAC" = "xyes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then
#On Mac we implicitly link against libz, so we
#never use the 3rdparty stuff.
[ "$CFG_ZLIB" = "yes" ] && CFG_ZLIB="system"
@@ -6752,6 +6790,12 @@ if [ "$CFG_EXCEPTIONS" != "no" ]; then
QTCONFIG_CONFIG="$QTCONFIG_CONFIG exceptions"
fi
+if [ "$XPLATFORM_MINGW" = "yes" ]; then
+ # mkspecs/features/win32/default_pre.prf sets "no-rtti".
+ # Follow default behavior of configure.exe by overriding with "rtti".
+ QTCONFIG_CONFIG="$QTCONFIG_CONFIG rtti"
+fi
+
if [ "$CFG_ALSA" = "yes" ]; then
QT_CONFIG="$QT_CONFIG alsa"
fi
@@ -7345,7 +7389,7 @@ EOF
echo '/* Compile time features */' >>"$outpath/src/corelib/global/qconfig.h.new"
[ '!' -z "$LicenseKeyExt" ] && echo "#define QT_PRODUCT_LICENSEKEY \"$LicenseKeyExt\"" >>"$outpath/src/corelib/global/qconfig.h.new"
-if [ "$CFG_LARGEFILE" = "yes" ]; then
+if [ "$CFG_LARGEFILE" = "yes" ] && [ "$XPLATFORM_MINGW" != "yes" ]; then
echo "#define QT_LARGEFILE_SUPPORT 64" >>"$outpath/src/corelib/global/qconfig.h.new"
fi
@@ -7690,7 +7734,7 @@ QMAKE_LIBDIR_QT = \$\$QT_BUILD_TREE/lib
EOF
# Ensure we can link to uninistalled libraries
-if linkerSupportsFlag -rpath-link "$outpath/lib"; then
+if [ "$XPLATFORM_MINGW" != "yes" ] && linkerSupportsFlag -rpath-link "$outpath/lib"; then
echo "QMAKE_LFLAGS += -Wl,-rpath-link,\$\$QT_BUILD_TREE/lib" >> "$CACHEFILE.tmp"
fi
@@ -8228,7 +8272,9 @@ for file in .projects .projects.3; do
[ "$IN_ROOT" = "no" ] && continue
case $a in
- *winmain/winmain.pro) continue ;;
+ *winmain/winmain.pro)
+ [ "$XPLATFORM_MINGW" = "yes" ] || continue
+ SPEC=$XQMAKESPEC ;;
*s60main/s60main.pro) continue ;;
*examples/activeqt/*) continue ;;
*/qmake/qmake.pro) continue ;;
diff --git a/demos/spectrum/app/mainwidget.h b/demos/spectrum/app/mainwidget.h
index b3dc352..ddab8b7 100644
--- a/demos/spectrum/app/mainwidget.h
+++ b/demos/spectrum/app/mainwidget.h
@@ -59,7 +59,6 @@ QT_FORWARD_DECLARE_CLASS(QLabel)
QT_FORWARD_DECLARE_CLASS(QPushButton)
QT_FORWARD_DECLARE_CLASS(QMenu)
QT_FORWARD_DECLARE_CLASS(QAction)
-QT_END_NAMESPACE
/**
* Main application widget, responsible for connecting the various UI
diff --git a/doc/doc.pri b/doc/doc.pri
index 3180a61..f748f3d 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -5,9 +5,9 @@
DOCS_GENERATION_DEFINES =
GENERATOR = $$QT_BUILD_TREE/bin/qhelpgenerator
-win32:!win32-g++ {
+win32:!win32-g++* {
unixstyle = false
-} else :win32-g++:isEmpty(QMAKE_SH) {
+} else :win32-g++*:isEmpty(QMAKE_SH) {
unixstyle = false
} else {
unixstyle = true
@@ -36,9 +36,15 @@ QT_ZH_CN_DOCUMENTATION = ($$QDOC qt-api-only_zh_CN.qdocconf) && \
$$GENERATOR doc-build/html-qt_zh_CN/qt.qhp -o doc/qch/qt_zh_CN.qch \
)
-win32-g++:isEmpty(QMAKE_SH) {
+QT_JA_JP_DOCUMENTATION = ($$QDOC qt-api-only_ja_JP.qdocconf) && \
+ (cd $$QT_BUILD_TREE && \
+ $$GENERATOR doc-build/html-qt_ja_JP/qt.qhp -o doc/qch/qt_ja_JP.qch \
+ )
+
+win32-g++*:isEmpty(QMAKE_SH) {
QT_DOCUMENTATION = $$replace(QT_DOCUMENTATION, "/", "\\\\")
QT_ZH_CN_DOCUMENTATION = $$replace(QT_ZH_CN_DOCUMENTATION, "/", "\\\\")
+ QT_JA_JP_DOCUMENTATION = $$replace(QT_JA_JP_DOCUMENTATION, "/", "\\\\")
}
# Build rules:
@@ -52,6 +58,9 @@ docs.depends = sub-qdoc3 adp_docs qch_docs
docs_zh_CN.depends = docs
docs_zh_CN.commands = $$QT_ZH_CN_DOCUMENTATION
+docs_ja_JP.depends = docs
+docs_ja_JP.commands = $$QT_JA_JP_DOCUMENTATION
+
# Install rules
htmldocs.files = $$QT_BUILD_TREE/doc/html
htmldocs.path = $$[QT_INSTALL_DOCS]
@@ -67,5 +76,5 @@ docimages.path = $$[QT_INSTALL_DOCS]/src
sub-qdoc3.depends = sub-corelib sub-xml
sub-qdoc3.commands += (cd tools/qdoc3 && $(MAKE))
-QMAKE_EXTRA_TARGETS += sub-qdoc3 adp_docs qch_docs docs docs_zh_CN
+QMAKE_EXTRA_TARGETS += sub-qdoc3 adp_docs qch_docs docs docs_zh_CN docs_ja_JP
INSTALLS += htmldocs qchdocs docimages
diff --git a/doc/src/ja_JP/development/designer-manual.qdoc b/doc/src/ja_JP/development/designer-manual.qdoc
new file mode 100644
index 0000000..585af16
--- /dev/null
+++ b/doc/src/ja_JP/development/designer-manual.qdoc
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page designer-quick-start.html
+
+ \title Qt Designer クイックガイド
+
+ \QD を使うための基本的な手順は、以下の\bold{四つ}です。
+
+ \list 1
+ \o フォームとオブジェクトを選択する
+ \o フォームにオブジェクトを配置する
+ \o スロットにシグナルを接続する
+ \o フォームをプレビューする
+ \endlist
+
+ \image rgbController-screenshot.png
+
+ Red、Green、Blue(RGB)の値を操作するために必要なコントロールを含む
+ 小さなウィジェット(上記スクリーンショット参照)を設計する場合を想定します。
+ このウィジェットは、画像処理プログラム内のどこからでも表示できるウィジェットです。
+
+ \table
+ \row
+ \i \inlineimage designer-choosing-form.png
+ \i \bold{フォームを選択する}
+
+ \gui{新しいフォーム} ダイアログから \gui Widget を選択して開始します。
+ \endtable
+
+
+ \table
+ \row
+ \i \inlineimage rgbController-arrangement.png
+ \i \bold{フォームにウィジェットを配置する}
+
+ 3つのラベル(Label)、スピンボックス(Spin Box)、垂直方向のスライダ(Vertical Slider)をフォーム上へドラッグします。
+ ラベルの既定の文字列を変更するには、文字列をダブルクリックします。
+ 希望するレイアウトに合わせて配置します。
+ \endtable
+
+ 画像のようにこれらのウィジェットを配置するには、
+ レイアウトにウィジェットを配置する必要があります。
+ これを3つグループに対して行います。
+ まず "RED" ラベルを選択します。
+ 次に、\key Ctrl (Mac OS X では \key Command)キーを押したまま、対応するスピンボックスとスライダを選択します。
+ \gui{フォーム} メニューで、\gui{格子状に並べる}を選択します。
+
+ \table
+ \row
+ \i \inlineimage rgbController-form-gridLayout.png
+ \i \inlineimage rgbController-selectForLayout.png
+ \endtable
+
+ 他の2つのラベルに対しても、対応するスピンボックスとスライダごとにこの手順を繰り返します。
+
+ 次の手順は、これら3つのレイアウトを組み合わせて、1つの\bold{メインレイアウト}を作成することです。
+ メインレイアウトとは、トップレベルウィジェット(この場合は QWidget)のレイアウトです。
+ トップレベルウィジェットにレイアウトを配置することは重要です。
+ そうでなければ、ウィンドウをサイズ変更したときにウィンドウ上のウィジェットのサイズが変更されません。
+ レイアウトを設定するには、フォーム上の3つのレイアウト以外の任意の場所で\gui{右クリック}し、\gui{水平に並べる}を選択します。
+ または、\gui{格子状に並べる}を選択することもできます。
+ そのどちらでも同じ配置(以下を参照)で表示されます。
+
+ \image rgbController-final-layout.png
+
+ \note メインレイアウトはフォームに表示できません。
+ メインレイアウトがインストールされているかどうかを確認するには、
+ フォームをサイズ変更してみます。
+ インストールされている場合は、各ウィジェットのサイズが適宜変更されます。
+ または、\QD の \gui{Object Inspector} で確認することもできます。
+ トップレベルウィジェットにレイアウトが配置されていない場合、
+ その横に崩れたレイアウトのアイコン \inlineimage rgbController-no-toplevel-layout.png
+ が表示されます。
+
+ スライダをクリックして特定の値までドラッグするときに、
+ スピンボックスにスライダの位置を反映させます。
+ この操作を行うには、スライダの \l{QAbstractSlider::}{valueChanged()}
+ シグナルをスピンボックスの \l{QSpinBox::}{setValue()}
+ スロットに接続する必要があります。
+ また、逆方向、すなわちスピンボックスの \l{QSpinBox::}{valueChanged()}
+ シグナルをスライダの \l{QAbstractSlider::value()}{setValue()} スロットに接続する必要があります。
+
+ この操作を行うには、\key{F4} キーを押すか、\gui{編集|シグナル/スロットの編集} を選択し、
+ \gui{シグナル/スロットの編集}モードに切り替える必要があります。
+
+ \table
+ \row
+ \i \inlineimage rgbController-signalsAndSlots.png
+ \i \bold{シグナルをスロットに接続する}
+
+ スライダをクリックし、カーソルをスピンボックスまでドラッグします。
+ 以下のような \gui{シグナルスロットを設定} ダイアログがポップアップ表示されます。
+ 適切なシグナルとスロットを選択し、\gui OK をクリックします。
+ \endtable
+
+ \image rgbController-configure-connection1.png
+
+ 手順を(逆の順序で)繰り返し、
+ スピンボックスをクリックしてカーソルをスライダまでドラッグし、
+ スピンボックスの \l{QSpinBox::}{valueChanged()} シグナルを、
+ スライダの \l{QAbstractSlider::value()}{setValue()} スロットに接続します。
+
+ 以下のスクリーンショットは、適切なシグナルとスロットを選択するためのガイドとして利用できます。
+
+ \image rgbController-configure-connection2.png
+
+ RGBコントローラーの "RED" コンポーネントのオブジェクトが正常に接続されたので、
+ "GREEN" および "BLUE" コンポーネントにも同じ手順を繰り返します。
+
+ RGB値の範囲は 0 ~ 255 であるため、
+ スピンボックスとスライダを特定の範囲に制限する必要があります。
+
+ \table
+ \row
+ \i \inlineimage rgbController-property-editing.png
+ \i \bold{ウィジェットのプロパティを設定する}
+
+ 最初のスピンボックスをクリックします。
+ \gui{プロパティエディタ}に \l{QSpinBox} のプロパティが表示されます。
+ \l{QSpinBox::}{maximum} のプロパティに、"255" と入力します。
+ 次に、最初の垂直方向のスライダをクリックすると、
+ \l{QAbstractSlider} のプロパティが表示されます。
+ \l{QAbstractSlider::}{maximum} のプロパティにも、"255" と入力します。
+ 残りのスピンボックスとスライダに対しても、この処理を繰り返します。
+ \endtable
+
+ ここで、フォームをプレビューし、アプリケーションの外観を確認します。
+ この操作を行うには、\key{Ctrl + R} を押すか、
+ \gui{フォーム}メニューから\gui{プレビュー}を選択します。
+ スライダをドラッグすると、
+ スピンボックスにその値が反映されます(逆の場合も同じ)。
+ またサイズを変更し、子ウィジェットの管理に使用するレイアウトが
+ どのようにウィンドウのさまざまなサイズに対応しているか確認します。
+*/
+
diff --git a/doc/src/ja_JP/development/qmake-manual.qdoc b/doc/src/ja_JP/development/qmake-manual.qdoc
new file mode 100644
index 0000000..8c9297f
--- /dev/null
+++ b/doc/src/ja_JP/development/qmake-manual.qdoc
@@ -0,0 +1,212 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qmake-tutorial.html
+ \title qmake チュートリアル
+
+ このチュートリアルでは \c qmake の使い方を説明します。
+ このチュートリアルを読み終わったら \c qmake
+ のユーザガイドを読むことをお勧めします。
+
+ \section1 簡単な例
+
+ アプリケーションの基本的な実装は既に完了していて、
+ 次のファイルが作成されていると仮定します。
+
+ \list
+ \o hello.cpp
+ \o hello.h
+ \o main.cpp
+ \endlist
+
+ これらのファイルは Qt ディストリビューションの
+ \c{examples/qmake/tutorial} ディレクトリにあります。
+ アプリケーションの設定について知っておくべきことは、
+ それが Qt で書かれているということだけです。
+ まず、テキストエディタで \c{examples/qmake/tutorial} に
+ \c hello.pro というファイルを作成します。
+ 最初にすることは、開発プロジェクトに含まれるソースファイルとヘッダファイルを
+ \c qmake に教える行を追加することです。
+
+ ソースファイルをプロジェクトファイルに追加します。
+ これには \l{qmake Variable Reference#SOURCES}{SOURCES} 変数を使います。
+ 新しい行を作り、\c{SOURCES +=}、続いて hello.cpp を入力します。
+ つまり、以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 108
+
+ これを以下のようになるまでプロジェクトの各ソースファイルに対して行います:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 109
+
+ make に似たシンタックスを使いたい場合は、
+ 以下のように改行をエスケープしてすべてのファイルを 1 行に書きます:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 110
+
+ ソースファイルの一覧をプロジェクトファイルに追加しました。
+ 次にヘッダファイルを追加します。
+ ヘッダファイルはソースファイルと全く同じ方法で追加することができます。
+ ただし変数は \l{qmake Variable Reference#HEADERS}{HEADERS}
+ を使います。
+
+ これを終えると、プロジェクトファイルは以下のようになるでしょう:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 111
+
+ ターゲットの名前は自動的に設定され、
+ プロジェクトファイルと同じ名前になります。
+ ただしプラットフォームに合わせたサフィックスがつけられます。
+ 例えば、プロジェクトファイルが \c hello.pro である場合、
+ ターゲットは Windows では \c hello.exe 、Unix では \c hello になります。
+ プロジェクトファイルで別の名前を指定することもできます:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 112
+
+ 最後に \l{qmake Variable Reference#CONFIG}{CONFIG} 変数を設定します。
+ このアプリケーションは Qt アプリケーションなので \c CONFIG に
+ \c qt を追加する必要があります。
+ \c qmake は リンクの必要があるライブラリを追加し、
+ \c moc と \c uic の実行コマンドが Makefile に含まれるようにします。
+
+ 最終的なプロジェクトファイルは以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 113
+
+ \c qmake を使って、このアプリケーションのための Makefile を生成します。
+ プロジェクトのディレクトリでコマンドラインに次のように入力します:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 114
+
+ そして、使用するコンパイラによって \c make または \c nmake を入力します。
+
+ Visual Studio ユーザの場合、\c qmake は、以下のように
+ \c .dsp ファイルまたは \c .vcproj ファイルも作成できます:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 115
+
+ \section1 アプリケーションをデバッグできるようにする
+
+ アプリケーションのリリースバージョンはデバッグシンボルなどのデバッグ情報を含みません。
+ 開発中は、関連情報を含むアプリケーションのデバッグバージョンを作成するのが便利です。
+ これは、プロジェクトファイルの \c CONFIG 変数に \c debug
+ を追加することで簡単に実現できます。
+
+ たとえば:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 116
+
+ 直前の例と同様に、Makefile を生成するには \c qmake を使います。
+ アプリケーションをデバッグ環境で実行する際に役に立つ情報を得られるようになります。
+
+ \section1 プラットフォーム固有のソースファイルを追加する
+
+ 数時間コーディングをしていると、
+ アプリケーションにプラットフォーム固有な部分が出てきて
+ プラットフォーム固有のコードを別のファイルに分けたい場合があるかもしれません。
+ ここでは 2 つのファイル \c hellowin.cpp と \c hellounix.cpp があるとして、
+ これをプロジェクトファイルに追加します。
+ これらのファイルをそのまま \c SOURCES 変数に追加することはできません。
+ なぜなら、両方のファイルが Makefile に追加されてしまうからです。
+ \c qmake が実行されたプラットフォームにしたがって処理されるスコープを使う必要があります。
+
+ Windows 用のファイルを追加するシンプルなスコープは以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 117
+
+ \c qmake が Windows 上で実行されると、ソースファイルのリストに
+ \c hellowin.cpp が追加されます。
+ \c qmake が他のプラットフォームで実行された場合、この部分は無視されます。
+ 次に Unix 用ファイルのスコープを作成します。
+
+ これを終えると、プロジェクトファイルは以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 118
+
+ これまでと同様に、Makefile を生成するには \c qmake を使います。
+
+ \section1 ファイルが存在しない場合に qmake を中止する
+
+ 特定のファイルが存在しない場合に Makefile を作成したくない場合、
+ exists() 関数を使ってファイルが存在するかどうかを確認することができます。
+ また error() 関数を使って \c qmake の処理を中止させることができます。
+ これらの関数はスコープとして動作します。
+ 使い方はスコープの条件をこれらの関数で置き換えるだけです。
+ \c main.cpp ファイルの確認は以下のようになります :
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 119
+
+ 記号 \c{!} はテストを否定します。
+ つまり \c{exists( main.cpp )} はファイルが存在する場合に真になり、
+ \c{!exists( main.cpp )} はファイルが存在しない場合に真になります。
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 120
+
+ 前と同様に、\c qmake を実行して Makefile を生成します。
+ 仮に \c main.cpp の名前を変更すると、上記のメッセージが表示され、
+ \c qmake は処理を中止します。
+
+ \section1 複数の条件をチェックする
+
+ Windows を使っていて、
+ コマンドラインからこのアプリケーションを実行したときに
+ qDebug() の出力を見ることができるようにしたい場合、
+ アプリケーションをコンソールの設定を追加してビルドする必要があります。
+ Windows で Makefile をこの設定にするには、
+ \c CONFIG に \c console を追加します。
+ Windows で実行されていて、\e{かつ} \c CONFIG にすでに \c debug
+ がある場合にのみ \c CONFIG を追加したい場合があるかもしれません。
+ このような場合、2 つのスコープをネストさせて使います。
+ まず 1 つのスコープを作成し、その中にもう 1 つスコープを作成します。
+ そして 2 つのスコープの中に設定を書きます。例えば:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 121
+
+ ネストされたスコープはコロンを使ってつなぐことができます。
+ 最終的なプロジェクトファイルは以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 122
+
+ 以上です。\c qmake のチュートリアルが終了しました。
+ それでは、あなたの開発プロジェクトのプロジェクトファイルを作成してみましょう。
+*/
+
diff --git a/doc/src/ja_JP/development/qtestlib.qdoc b/doc/src/ja_JP/development/qtestlib.qdoc
new file mode 100644
index 0000000..65c4c3f
--- /dev/null
+++ b/doc/src/ja_JP/development/qtestlib.qdoc
@@ -0,0 +1,432 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qtestlib-tutorial.html
+ \brief QTestLib を使ったテストの導入ガイド
+ \contentspage QTestLib マニュアル
+ \nextpage {第1章: ユニットテストの作成}{第1章}
+
+ \title QTestLib チュートリアル
+
+ このチュートリアルでは QTestLib フレームワークの機能の初歩的な使い方を説明します。
+ このチュートリアルは全5章で構成されています:
+
+ \list 1
+ \o \l {第1章: ユニットテストの作成}{ユニットテストの作成}
+ \o \l {第2章: データドリブンテスト}{データドリブンテスト}
+ \o \l {第3章: GUI イベントのシミュレート}{GUI イベントのシミュレート}
+ \o \l {第4章: GUI イベントの再現}{GUI イベントの再現}
+ \o \l {第5章: ベンチマークの作成}{ベンチマークの作成}
+ \endlist
+
+*/
+
+
+/*!
+ \example qtestlib/tutorial1
+
+ \contentspage {QTestLib チュートリアル}{目次}
+ \nextpage {第2章: データドリブンテスト}{第2章}
+
+ \title 第1章: ユニットテストの作成
+
+ 第1章では、クラスのテストを行うシンプルなユニットテストを作成して実行する方法を説明します。
+
+ \section1 テストを作成する
+
+ QString クラスの挙動をテストすると仮定しましょう。
+ まず、テスト関数を含むクラスが必要です。
+ このクラスは、 QObject を継承する必要があります:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 0
+
+ QTest ヘッダーを include してください。
+ それから、テストフレームワークがテスト関数を検索して実行できるよう、
+ テスト関数を private slot として宣言する必要があります。
+
+ 次に、テスト関数を実装します。実装は以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 8
+
+ \l QVERIFY() マクロは、引数として渡される式を評価します。
+ 式が真と評価されるとテスト関数の実行が継続されます。
+ そうでなければ、エラーメッセージがテストログに追加されテスト関数の実行が停止します。
+
+ テストログに詳細情報を追加したい場合は、
+ \l QCOMPARE() マクロを代わりに使用してください:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 1
+
+ 文字列が等しくない場合、両方の文字列の内容がテストログに追加され、
+ 比較に失敗した理由を直ちに確認できます。
+
+ 最後に、テストケースを実行可能にするために以下の2行が必要となります:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 2
+
+ \l QTEST_MAIN() マクロは、すべてのテスト関数を実行するシンプルな
+ \c main() 関数に展開されます。
+ テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、
+ Qt のメタオブジェクト機能を動作させるために、
+ 生成された moc ファイルを include する必要があります。
+
+ \section1 テストを実行する
+
+ 作成したテストを実行してみましょう。
+ テストが \c testqstring.cpp
+ として空のディレクトリに保存されていると仮定して、
+ qmake を使用してプロジェクトを作成し、makefile を生成します。
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 9
+
+ \bold {注:} Windows をお使いの場合、 \c make を \c nmake または、
+ 任意のビルドツールに置き換えてください。
+
+ 作成した実行ファイルを実行すると、次の出力が表示されます:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 10
+
+ おめでとうございます!
+ QTestLib フレームワークを使用して、
+ 最初のユニットテストの作成と実行に成功しました。
+*/
+
+/*!
+ \example qtestlib/tutorial2
+
+ \previouspage {第1章: ユニットテストの作成}{第1章}
+ \contentspage {QTestLib チュートリアル}{目次}
+ \nextpage {第3章: GUI イベントのシミュレート}{第3章}
+
+ \title 第2章: データドリブンテスト
+
+ 本章ではテストを複数回、それぞれ異なるテストデータを使用して行う方法について、
+ 例を示しながら説明します。
+
+ これまでは、テストデータをテスト関数にハードコードしていました。
+ この場合、テストデータを追加した関数は以下のようになります:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 11
+
+ 関数が繰り返しを行うコードによって分散するのを防ぐために、
+ QTestLib はテストデータのテスト関数への追加をサポートします。
+ そのために、別の private slot をテストクラスに追加する必要があります:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 0
+
+ \section1 データ関数を記述する
+
+ テスト関数に関連するデータ関数では、テスト関数と同じ関数名を使用して、
+ 末尾に \c{_data} を追加します。
+ データ関数は以下のようになります:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 1
+
+ まず、 \l QTest::addColumn() 関数を使用して、
+ テストテーブルの2つの要素(テスト文字列(\c{"string"})および、
+ QString::toUpper() 関数をその文字列に適用するときに予期された結果(\c{"result"}))
+ を定義します。
+
+ 次に、 \l QTest::newRow() 関数を使用して、
+ データをテーブルに追加します。
+ それぞれのデータセットは、テストテーブルでは別々の行(Row)になります。
+
+ \l QTest::newRow() は、データセット名をその引数として受け付けます。
+ テストに失敗した場合、テストログでこのデータセット名が使用され、
+ 失敗したデータの一覧が表示されます。
+ 続いて、最初に任意の文字列(\c{"string"})を、次に
+ QString::toUpper() 関数をその文字列(\c{"string"})に適用するときに予期された結果(\c{"result"})の順に、
+ テーブル行にデータセットをストリーミングします。
+
+ テストデータとは、二次元テーブルを指します。
+ ここでは、\c string および \c result と呼ばれる2つの列と3つの行が含まれます。
+ さらに、インデックスと同様に、各行に名前を関連付けます:
+
+ \table
+ \header
+ \o index
+ \o name
+ \o string
+ \o result
+ \row
+ \o 0
+ \o all lower
+ \o "hello"
+ \o HELLO
+ \row
+ \o 1
+ \o mixed
+ \o "Hello"
+ \o HELLO
+ \row
+ \o 2
+ \o all upper
+ \o "HELLO"
+ \o HELLO
+ \endtable
+
+ \section1 テスト関数を書き換える
+
+ ここで、テスト関数の書き換えを行います:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 2
+
+ TestQString::toUpper() 関数は 3 回実行されます。
+ すなわち、関連する TestQString::toUpper_data()
+ 関数で作成したテストテーブルの各エントリ毎に一度実行されます。
+
+ TestQString::toUpper() 関数では
+ まず、 \l QFETCH() マクロを使用して、データセットの2つの要素を取得します。
+ \l QFETCH() は、要素のデータタイプと要素名の、
+ 2 つの引数を取ります。
+ 次に \l QCOMPARE() マクロを使用して、テストを実行します。
+
+ このアプローチにより、テストの修正を行うことなく
+ テストに新規データを非常に簡単に追加できます。
+
+ このテストの場合も、テストケースを実行可能にするには、
+ 同様に以下の2行が必要です:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 3
+
+ これまでと同様に、 \l QTEST_MAIN() マクロは
+ すべてのテスト関数を実行するシンプルな
+ \c main() 関数に展開されます。
+ テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、
+ Qt のメタオブジェクト機能を動作させるために、
+ 生成された moc ファイルを include する必要があります。
+
+*/
+
+/*!
+ \example qtestlib/tutorial3
+
+ \previouspage {第2章: データドリブンテスト}{第2章}
+ \contentspage {QTestLib チュートリアル}{目次}
+ \nextpage {第4章: GUI イベントの再現}{第4章}
+
+ \title 第3章: GUI イベントのシミュレート
+
+ QTestLib にはグラフィカルユーザインターフェースをテストするための機能があります。
+ QTestLib は、ネイティブなウィンドウシステムのイベントをシミュレートする代わりに、
+ Qt の内部で使われるイベントを送信します。
+ このため、テストが実行されるコンピュータには
+ 副次的な悪影響が発生しません。
+
+ 本章では、シンプルな GUI テストを作成する方法を確認します。
+
+ \section1 GUI テストを作成する
+
+ 今回は、 QLineEdit クラスの挙動をテストすると仮定しましょう。
+ これまでと同様に、テスト関数を含むクラスが必要です:
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 0
+
+ 唯一の違いは、 QTest だけでなく、 QtGui クラスの宣言を
+ include する必要があることです。
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 1
+
+ テスト関数を実装する際は、最初に QLineEdit を作成します。
+ 次に、 \l QTest::keyClicks() 関数を使用して、
+ "hello world" をラインエディットに入力する操作をシミュレートします。
+
+ \note キーボードショートカットを正しくテストするには、
+ ウィジェットの表示も必要になります。
+
+ QTest::keyClicks() は、
+ ウィジェットのキーシーケンスの入力をシミュレートします。
+ 必要に応じてキーボード修飾子の指定や、
+ 各キー入力後の遅延(ミリ秒単位)を指定することができます。
+ 同様に、 QTest::keyClick() 、 QTest::keyPress() 、 QTest::keyRelease() 、
+ QTest::mouseClick() 、 QTest::mouseDClick() 、 QTest::mouseMove() 、
+ QTest::mousePress() 及び QTest::mouseRelease() 関数を使用して、
+ 関連付けられた GUI イベントをシミュレートできます。
+
+ 最後に、 \l QCOMPARE() マクロを使用して、
+ ラインエディットの文字列が正しいかどうか確認します。
+
+ これまでと同様に、
+ テストケースを実行可能にするには、
+ 以下の2行が必要です:
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 2
+
+ QTEST_MAIN() マクロは
+ すべてのテスト関数を実行するシンプルな
+ \c main() 関数に展開されます。
+ テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、
+ Qt のメタオブジェクト機能を動作させるために、
+ 生成された moc ファイルを include する必要があります。
+*/
+
+/*!
+ \example qtestlib/tutorial4
+
+ \previouspage {第3章: GUI イベントのシミュレート}{第3章}
+ \contentspage {QTestLib チュートリアル}{目次}
+ \nextpage {第5章: ベンチマークの作成}{第5章}
+
+ \title 第4章: GUI イベントの再現
+
+ 本章では、GUI イベントをシミュレートしたり、
+ あるウィジェットで一連の GUI イベントを再生したり保存したりする方法について説明します。
+
+ 一連のイベントを保存して再生するアプローチは、
+ \l{第2章: データドリブンテスト}{第2章}
+ で説明したアプローチとよく似ています。
+ 必要な変更は、テストクラスにデータ関数を追加することです:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 0
+
+ \section1 データ関数を記述する
+
+ これまでと同様にテスト関数に関連するデータ関数では、
+ テスト関数と同じ名前を使用して末尾に \c{_data} を追加します。
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 1
+
+ まず、 QTest::addColumn() 関数を使用して、
+ テーブルの2つの要素(GUI イベントのリスト(\c{"events"})および、
+ QWidget のイベントのリストを適用するときに予期された結果(\c{"expected"}))を定義します。
+ 最初の要素の型は \l QTestEventList であることに注意してください。
+
+ QTestEventList では、後で使用するテストデータの保存を行うために
+ GUI イベントを読み込んだり、 QWidget ウィジェットで再生したりできます。
+
+ 現在のデータ関数で、 \l QTestEventList を2つ作成します。
+ 最初のリストには 'a' キーを一度だけ入力します。
+ QTestEventList::addKeyClick() 関数を使用して、
+ リストにイベントを追加します。
+ 次に、QTest::newRow() 関数を使用してデータセットに名前を付けて、
+ テーブルにイベントリストおよび予期された結果をストリーミングします。
+
+ 2つ目のリストには、2つのキー入力('a' に続いてバックスペース(Qt::Key_Backspace))を設定します。
+ QTestEventList::addKeyClick() を使用してリストにイベントを追加し、
+ QTest::newRow() を使用して名前を関連付けたテーブルにイベントリストおよび予期された結果を挿入します。
+
+ \section1 テスト関数を書き換える
+
+ ここで、テストの書き換えを行います:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 2
+
+ TestGui::testGui() 関数は2回実行されます。
+ 関連する TestGui::testGui_data()
+ 関数で作成したテストデータの各エントリ毎にそれぞれ実行されます。
+
+ まず、\l QFETCH() マクロを使用して、データセットの2つの要素を取得します。
+ \l QFETCH() は、要素のデータ型と要素名の2つの引数を取ります。
+ 次に QLineEdit を作成し、 QTestEventList::simulate() 関数を使用して
+ ウィジェットにイベントのリストを適用します。
+
+ 最後に、 QCOMPARE() マクロを使用してラインエディットの文字列が正しいかどうか確認します。
+
+ これまでと同様に、
+ テストケースを実行可能にするには、
+ 以下の2行が必要です:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 3
+
+ \l QTEST_MAIN() マクロは
+ すべてのテスト関数を実行するシンプルな
+ \c main() 関数に展開されます。
+ テストクラスの宣言と実装が \c .cpp ファイルに存在する場合、
+ Qt のメタオブジェクト機能を動作させるために、
+ 生成された moc ファイルを include する必要があります。
+*/
+
+/*!
+ \example qtestlib/tutorial5
+
+ \previouspage {第4章: GUI イベントの再現}{第4章}
+ \contentspage {QTestLib チュートリアル}{目次}
+
+ \title 第5章: ベンチマークの作成
+
+ 最終章となる本章では QTestLib を使ってベンチマークを作成する方法について説明します。
+
+ \section1 ベンチマークの作成
+ ベンチマークを作成するには QBENCHMARK マクロを用いてテスト関数を拡張します。
+ ベンチマークテスト関数には通常、テストの準備コードと測定するコードを含む
+ QBENCHMARK マクロが一つ含まれます。
+ QString::localeAwareCompare() のベンチマークを行う関数は以下のようになります。
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 0
+
+ 測定の準備は関数の最初に行われています。
+ この時点では測定は始まっていません。
+ QBENCHMARK マクロで囲まれたブロックの中身のみが計測されます。
+ このブロックの内部は正確な測定を行うために、何度か繰り返し実行される場合があります。
+
+ \l {testlib-benchmarking-measurement}{ベンチマークの方法}(バックエンド)は何種類か用意されており、
+ コマンドライン引数から選択することが出来ます。
+
+ \section1 データ関数
+
+ データ関数は複数のデータでベンチマークを行うテストを作成するのに有用です。
+ たとえば、ロケール準拠と標準的な比較を行う場合は以下のようになります。
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 1
+
+ テスト関数ではデータに従ってベンチマークする手法を決定します。
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 2
+
+ "if (useLocaleCompare)" 文はそのオーバヘッドを測定対象外とするために
+ QBENCHMARK マクロのブロックの外部にあります。
+ ベンチマークの実行時にはそれぞれどちらか一つの QBENCHMARK マクロが実行されます。
+
+ \section1 外部ツール
+
+ テストデータの可視化を行うためのツールが Qt Labs Web サイトの
+ \l{qtestlib-tools} プロジェクトに含まれています。
+ そこには実行したテストの結果からパフォーマンスを比較したり、
+ パフォーマンスのWeb用グラフを作成するツールが含まれています。
+
+ それらのツールの詳細と簡単なグラフの例は
+ \l{qtestlib-tools Announcement} を参照してください。
+
+*/
+
+
+
diff --git a/doc/src/ja_JP/examples/arrowpad.qdoc b/doc/src/ja_JP/examples/arrowpad.qdoc
new file mode 100644
index 0000000..2518264
--- /dev/null
+++ b/doc/src/ja_JP/examples/arrowpad.qdoc
@@ -0,0 +1,248 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/arrowpad
+ \title サンプル: アローパッド
+
+ この例では、\e {Qt Linguist} の主なコンセプトである"文脈"について、
+ 少し詳しく取り上げて説明します。
+ また、2つ以上の言語を使用する方法についても説明します。
+
+ \image linguist-arrowpad_en.png
+
+ アプリケーションで使用可能な言語の数に制限はありませんが、
+ ここではフランス語とオランダ語の2言語の翻訳を使用します。
+ \c arrowpad.pro の関連する行は以下のとおりです。
+
+ \snippet examples/linguist/arrowpad/arrowpad.pro 0
+ \codeline
+ \snippet examples/linguist/arrowpad/arrowpad.pro 1
+
+ \c lupdate を実行すると、2つの類似したメッセージファイル
+ \c arrowpad_fr.ts と \c arrowpad_nl.ts が作成されます。
+ これらのファイルにはすべてのソーステキストとその文脈が含まれます。
+ それらのテキストは \c tr() の呼び出しを通じて翻訳対象として
+ ソースコード内でマークされているものです。
+
+ Qt アプリケーションの翻訳の詳細については、
+ \l{Qt Linguist manual}{Qt Linguist マニュアル} をご覧ください。
+
+ \section1 各行の簡単な解説
+
+ \c arrowpad.h では、 QWidget の派生クラスである \c ArrowPad
+ クラスを定義します。
+ 上記のスクリーンショットで
+ 中央の 4 つのボタンを持つウィジェットが \c ArrowPad です。
+
+ \snippet examples/linguist/arrowpad/arrowpad.h 0
+ \snippet examples/linguist/arrowpad/arrowpad.h 1
+ \snippet examples/linguist/arrowpad/arrowpad.h 2
+
+ \c lupdate を実行するとソーステキストの抽出だけでなく、
+ 文脈へのグループ化を行うことができます。
+ ソーステキストが表示されるクラスの名前が文脈となります。
+ 従って、この例では、"ArrowPad" が
+ \c ArrowPad クラスの文字列の文脈です。
+ \c Q_OBJECT のマクロは、以下の内容で
+ \c ArrowPad に \c tr(x) を定義します:
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 0
+
+ 各ソーステキストが表示されるクラスを把握しておくと、
+ \e {Qt Linguist} で論理的に関連のある文字列をグループ化することが出来ます。
+ 例えば、ダイアログ内のすべての文字列には
+ ダイアログのクラス名の文脈が含まれるため、同時に表示されます。
+ 文字列が表示される文脈によって翻訳の内容が影響を受ける場合があるため、
+ 翻訳者にとって有用な情報となります。
+ 一部の翻訳では、キーボードショートカットを変更する必要があります。
+ また、同じグループにまとめられた特定の文脈(クラス)
+ にすべてのソーステキストを含めることにより、
+ 翻訳者はコンフリクトを起こすことなく、
+ より簡単にショートカットを変更できます。
+
+ \c arrowpad.cpp で、\c ArrowPad クラスを実装します。
+
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 0
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 1
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 2
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 3
+
+ ラベルはユーザ表示可能な文字列であるため、
+ ボタンのラベルごとに \c ArrowPad::tr() を呼び出します。
+
+ \image linguist-arrowpad_en.png
+
+ \snippet examples/linguist/arrowpad/mainwindow.h 0
+ \snippet examples/linguist/arrowpad/mainwindow.h 1
+
+ 上記のスクリーンショットでは、ウィンドウ全体が \c MainWindow です。
+ これは、\c mainwindow.h ヘッダーファイルで定義します。
+ ここでも、\c MainWindow が \e {Qt Linguist} の文脈になるよう、
+ \c Q_OBJECT を使用します。
+
+ \snippet examples/linguist/arrowpad/mainwindow.cpp 0
+
+ \c MainWindow と \c mainwindow.cpp を実装する際に、
+ \c ArrowPad クラスのインスタンスを作成します。
+
+ \snippet examples/linguist/arrowpad/mainwindow.cpp 1
+
+ また、\c MainWindow::tr() を、
+ アクションおよびショートカット用に、計 2 回呼び出します。
+
+ \c tr() を使用して、言語によって異なるキーをサポートします。
+ 英語の場合、"Ctrl+Q" は Quit (終了) に適していますが、
+ オランダ語の翻訳者は "Ctrl+A" (Afsluiten の場合) を、
+ ドイツ語の翻訳者は "Strg+E" (Beenden の場合) を使うといいでしょう。
+ \key Ctrl キーショートカットを \c tr() で使用する場合は
+ 引数を 2 つ使用して、
+ ショートカットが実行する機能を2番目の引数に記述してください。
+
+ \c main.cpp で定義した標準的な \c main() 関数は、以下のようになります。
+
+ \snippet examples/linguist/arrowpad/main.cpp 2
+ \snippet examples/linguist/arrowpad/main.cpp 3
+
+ 現在のロケールに基づいて、使用する翻訳を選択します。
+ 例えば、QLocale::system() は、
+ \c LANG 環境変数の設定によって影響を受ける場合があります。
+ \c .qm メッセージファイル(および TS ファイル)の命名規則に
+ ロケールを使用すると、
+ 簡単にロケールに基づいて翻訳ファイルを選択することが
+ できるようになります。
+
+ 選択したロケールに QM メッセージファイルが存在しない場合、
+ 元のソーステキストが使用され、エラーは生成されません。
+
+ \section1 フランス語からオランダ語に翻訳する
+
+ ここでは、サンプルアプリケーションをフランス語に翻訳することから始めます。
+ \e {Qt Linguist} を起動し、\c arrowpad_fr.ts の作業を行います。
+ 2つの文脈 ("ArrowPad" および "MainWindow")
+ にグループ化された7つのソーステキスト ("\&Up", "\&Left" 等)
+ が含まれているはずです。
+
+ 次に、以下の翻訳を入力します:
+
+ \list
+ \o \c ArrowPad
+ \list
+ \o \&Up - \&Haut
+ \o \&Left - \&Gauche
+ \o \&Right - \&Droite
+ \o \&Down - \&Bas
+ \endlist
+ \o \c MainWindow
+ \list
+ \o E\&xit - \&Quitter
+ \o Ctrl+Q - Ctrl+Q
+ \o \&File - \&Fichier
+ \endlist
+ \endlist
+
+ 翻訳の入力が終わったら、 \key{Ctrl+Return} (もしくは\gui {完了にして次へ}
+ ボタン)を押すと、
+ 翻訳が完了とマークされ次のソーステキストに移動するため便利です。
+
+ ファイルを保存して、オランダ語の翻訳でも同じ手順を実行し、
+ \c arrowpad_nl.ts の作業を行います:
+
+ \list
+ \o \c ArrowPad
+ \list
+ \o \&Up - \&Omhoog
+ \o \&Left - \&Links
+ \o \&Right - \&Rechts
+ \o \&Down - Omlaa\&g
+ \endlist
+ \o \c MainWindow
+ \list
+ \o E\&xit - \&Afsluiten
+ \o Ctrl+Q - Ctrl+A
+ \o File - \&Bestand
+ \endlist
+ \endlist
+
+ \c tt1_fr.ts と \c tt1_nl.ts の翻訳ソースファイルは
+ QM ファイルに変換する必要があります。
+ 以前と同様の方法で \e {Qt Linguist} を使用して変換できますが、
+ コマンドラインツール \c lrelease を使うと
+ \e {Qt Linguist} から個々の \gui {ファイル|リリース} を読み込まなくても、
+ アプリケーションの\e{すべての} QM ァイルを作成できます。
+
+ 以下を入力します:
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 1
+
+ これにより、\c arrowpad_fr.qm と \c arrowpad_nl.qm が作成されます。
+ \c LANG 環境変数を \c fr に設定します。
+ Unix では、以下の2つのコマンドのいずれかが機能します。
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 2
+
+ Windows では、\c autoexec.bat を修正するか、以下を実行します。
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 3
+
+ プログラムを実行すると、フランス語版が表示されます:
+
+ \image linguist-arrowpad_fr.png
+
+ \c LANG=nl を設定し、オランダ語でも同じ手順を実行します。
+ これで、オランダ語版が表示されます:
+
+ \image linguist-arrowpad_nl.png
+
+ \section1 エクササイズ
+
+ \e {Qt Linguist} で未完了の翻訳を行います。
+ 例えば、各テキストのチェックマークをクリックして翻訳を未完了の状態にして保存します。
+ その後、 \c lupdate 、\c lrelease 、サンプルの順に実行します。
+ この変更がどのような影響を及ぼしましたか。
+
+ \c LANG=fr_CA (フランス語(カナダ))に設定し、
+ サンプルプログラムを再実行します。
+ \c LANG=fr の場合と同じ結果になる理由を説明してください。
+
+ オランダ語翻訳のショートカットのいずれかを変更し、
+ \e \&Bestand と \e \&Boven の競合を解消します。
+*/
diff --git a/doc/src/ja_JP/examples/hellotr.qdoc b/doc/src/ja_JP/examples/hellotr.qdoc
new file mode 100644
index 0000000..cc01b81
--- /dev/null
+++ b/doc/src/ja_JP/examples/hellotr.qdoc
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/hellotr
+ \title サンプル: こんにちは tr()
+
+ これは、小さな Hello World プログラムを日本語に翻訳する例です。
+ 以下のスクリーンショットは英語版です。
+
+ \image linguist-hellotr_en.png
+
+ Qt アプリケーションの翻訳に関する詳細は、\l{Qt Linguist manual}
+ をご覧ください。
+
+ \section1 各行の簡単な解説
+
+ \snippet examples/ja_JP/linguist/hellotr/main.cpp 0
+
+ この行では、 QTranslator クラスの宣言を読み込みます。
+ QTranslator クラスのオブジェクトは、
+ ユーザに表示する文字列を翻訳します。
+
+ \snippet examples/ja_JP/linguist/hellotr/main.cpp 5
+
+ 親をもたない QTranslator オブジェクトを作成します。
+
+ \snippet examples/ja_JP/linguist/hellotr/main.cpp 6
+
+ プログラムで使用するソーステキストの日本語の翻訳を含む、
+ \c hellotr_ja.qm ( \c .qm というファイル拡張子は省略します)
+ と呼ばれるファイルを読み込みます。
+ ファイルが見つからなくてもエラーは発生しません。
+
+ \snippet examples/ja_JP/linguist/hellotr/main.cpp 7
+
+ \c hellotr_ja.qm の翻訳を、プログラムで使用する翻訳プールに追加します。
+
+ \snippet examples/ja_JP/linguist/hellotr/main.cpp 8
+
+ "Hello world!" を表示するプッシュボタンを作成します。
+ 検索した \c hellotr_ja.qm に "Hello world!" の翻訳が含まれている場合、
+ その翻訳が表示されます。
+ 含まれていない場合、翻訳前のテキストがそのまま表示されます。
+
+ QObject を継承するすべてのクラスには、\c tr() 関数が含まれます。
+ QObject クラスのメンバ関数内では、\c QPushButton::tr("Hello world!")
+ や \c QObject::tr("Hello world!") の代わりに、シンプルに
+ \c tr("Hello world!") を使います。
+
+ \section1 英語版のアプリケーションを実行する
+
+ 翻訳ファイル \c hellotr_ja.qm の作成が終わっていないため、
+ 以下のアプリケーションを起動したときに元の文字列が表示されます。
+
+ \image linguist-hellotr_en.png
+
+ \section1 日本語のメッセージファイルを作成する
+
+ 最初のステップは、プロジェクトのすべてのソースファイルを列挙する
+ \c hellotr.pro を作成することです。
+ プロジェクトファイルは、qmake プロジェクトファイルまたは、通常の
+ makefile である可能性があります。
+ 以下の記述を含むプロジェクトファイルを作成してください。
+
+ \snippet examples/ja_JP/linguist/hellotr/hellotr.pro 0
+ \snippet examples/ja_JP/linguist/hellotr/hellotr.pro 1
+
+ \c TRANSLATIONS は、管理するメッセージファイルを指します。
+ この例では、日本語の翻訳のみ管理します。
+
+ ファイル拡張子は、\c .qm ではなく、\c .ts であることにご注意ください。
+ \c .ts は翻訳のソースファイルのフォーマットであり、
+ アプリケーションの開発時に使用します。
+ プログラマーまたはリリースマネージャーは \c lupdate プログラムを実行し、
+ ソースコードから抽出したソーステキストを使用して
+ TS ファイルの生成と更新を行います。
+ 翻訳者は、 \e {Qt Linguist} を使用して TS ファイルの読み取りと更新を行い、
+ 翻訳の追加と編集を行います。
+
+ TS の形式は、ユーザが直接閲覧可能な XML 形式であるため、
+ 直接Eメールで送信したり、簡単にバージョン管理の対象にすることが出来ます。
+ このファイルを手動で編集する場合、XML の既定のエンコードは UTF-8 で、
+ Latin1(ISO 8859-1)ではないことに気をつけてください。
+ '\oslash'(ノルウェー語の o にスラッシュが付いたもの)などの
+ Latin1 文字を入力する1つの方法は、XML エンティティ "&#xf8;"
+ を使用することです。
+ これはすべての Unicode 4.0 文字に対して有効です。
+
+ 翻訳が完了したら、\c lrelease プログラムを使用して、
+ TS ファイルを QM ファイル(Qt Message ファイル)形式に変換します。
+ QM 形式は、極めて高速な検索性能を実現するようにデザインされた
+ コンパクトなライブラリ形式です。
+ \c lupdate と \c lrelease はどちらも、
+ プロジェクト全体のソースファイルとヘッダーファイル
+ (プロジェクトファイルの HEADERS および SOURCES 行で指定されている)
+ を読み取り、\c tr() 関数呼び出しの際に表示される文字列を抽出します。
+
+ \c lupdate は、メッセージファイル(この場合は \c hellotr_ja.ts)
+ の作成と更新を行い、これらをソースコードと同期させるために使用します。
+ \c lupdate にはデータの削除機能がないため、
+ \c lupdate はいつでも安全に実行できます。
+ 例えば、ソースが変更されるたびに TS ファイルが更新されるよう、
+ makefile に記述できます。
+
+ それでは、以下のように \c lupdate を実行してみましょう:
+
+ \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 0
+
+ (\c -verbose オプションは、操作を説明するメッセージを表示するよう
+ \c lupdate に指示します。)
+ 現在のディレクトリに、以下の内容で
+ \c hellotr_ja.ts ファイルが作成されていると思います:
+
+ \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 1
+
+ ツール (\c lupdate、 \e {Qt Linguist}、\c lrelease)
+ を使用して読み取りと更新を行うため、
+ ファイル形式を理解する必要はありません。
+
+ \section1 Qt Linguist を使用して日本語に翻訳する
+
+ XML やテキストエディタを使用して、TS ファイルを翻訳することも出来ますが、
+ ここでは \e {Qt Linguist} を使用して翻訳を行います。
+
+ \e {Qt Linguist} を起動するには、以下を入力します。
+
+ \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 2
+
+ 左上のペインに "QPushButton" が表示されるはずです。
+ これをダブルクリックし、次に "Hello world!" をクリックして、
+ \gui Translation ペイン (ウィンドウ右中央)に
+ "こんにちは、世界!" と入力します。
+ 感嘆符(!)を忘れないように付けてください!
+
+ \gui{完了} チェックボックスをオンにして、
+ メニューバーから \gui{ファイル|保存} を選択します。
+ TS ファイルから、以下の記述がなくなります。
+
+ \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 3
+
+ その代わりに以下が含まれます。
+
+ \snippet doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc 4
+
+ \section1 日本語版のアプリケーションを実行する
+
+ 日本語版のアプリケーションを実行する前に、
+ TS ファイルから QM ファイルを生成する必要があります。
+ QM ファイルは、\e {Qt Linguist}(単一の TS ファイルの場合)のメニューから、
+ もしくは、コマンドラインプログラム \c lrelease を使用して生成できます。
+ \c lrelease を使用する場合、
+ プロジェクトファイルに列挙されている TS ファイルごとに
+ 1 つの QM ファイルを作成することが出来ます。
+ \e {Qt Linguist} のメニューバーから \gui{ファイル|リリース} を選択し、
+ ポップアップ表示される \gui{ファイルの保存} ダイアログで\gui{保存}を選択し、
+ \c hellotr_ja.ts から \c hellotr_ja.qm を生成します。
+ 今すぐ \c hellotr プログラムを再実行してみましょう。
+ これで、ボタンに "こんにちは、世界!" と表示されます。
+
+ \image linguist-hellotr_ja.png
+*/
diff --git a/doc/src/ja_JP/examples/trollprint.qdoc b/doc/src/ja_JP/examples/trollprint.qdoc
new file mode 100644
index 0000000..1686774
--- /dev/null
+++ b/doc/src/ja_JP/examples/trollprint.qdoc
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/trollprint
+ \title サンプル: トロールプリント
+
+ トロールプリント(Troll Print)は、
+ ユーザがプリンタの設定をするためのサンプルアプリケーションです。
+ これには、英語とポルトガル語の2つのバージョンが用意されています。
+
+ \image linguist-trollprint_10_en.png
+
+ この例では、いくつかのポルトガル語の翻訳を含む翻訳ファイル
+ \c trollprint_pt.ts を用意しました。
+
+ 同じアプリケーションの2つのバージョン、
+ Troll Print 1.0 と 1.1 をリリースすることを想定します。
+ 1つのバージョンで作成した翻訳を次のリリースで再利用する方法を習得します。
+ (このチュートリアルでは、いくつかのソースファイルの編集が必要です。
+ 新しい一時ディレクトリにすべてのファイルをコピーして、
+ ここで作業を行うのがベストでしょう。)
+
+ Qtアプリケーションの翻訳の詳細については、
+ \l{Qt Linguist manual}{Qt Linguist マニュアル} をご覧ください。
+
+ \section1 各行の簡単な解説
+
+ \c PrintPanel クラスを \c printpanel.h で宣言します。
+
+ \snippet examples/linguist/trollprint/printpanel.h 0
+
+ \c PrintPanel は QWidget の派生クラスです。
+ \c tr() が正しく動作するには、\c Q_OBJECT マクロが必要です。
+
+ 実装ファイルは \c printpanel.cpp です。
+
+ \snippet examples/linguist/trollprint/printpanel.cpp 0
+
+ Troll Print 1.0 で一部のコードがコメントアウトされています。
+ Troll Print 1.1 にバージョンアップする際に、
+ コメントから戻してください。
+
+ \snippet examples/linguist/trollprint/printpanel.cpp 1
+ \snippet examples/linguist/trollprint/printpanel.cpp 2
+
+ PrintPanel では、\c tr("Enabled") と \c tr("Disabled")
+ を2回ずつ使用することに注意してください。
+ "Enabled" と "Disabled" はどちらも同じ文脈で表示されるため、
+ \e {Qt Linguist} では、それぞれ1回目の使用に対してのみ表示され、
+ 2回目以降の使用に対しては翻訳が流用されるため表示されません。
+ これは便利な時間短縮ツールですが、ポルトガル語などの一部の言語では、
+ 2回目の使用に対して異なる翻訳が必要になります。
+ これから、\e {Qt Linguist}で、
+ すべての \c tr() に対して異なる翻訳を表示できるように設定する方法を学習します。
+
+ \c MainWindow, \c mainwindow.h はシンプルなヘッダーファイルです。
+ \c mainwindow.cpp の実装には、翻訳対象としてマークする必要のある
+ ユーザに表示するソーステキストがあります。
+
+ \snippet examples/linguist/trollprint/mainwindow.cpp 0
+
+ ウィンドウのタイトルは翻訳する必要があります。
+
+ \snippet examples/linguist/trollprint/mainwindow.cpp 1
+ \snippet examples/linguist/trollprint/mainwindow.cpp 3
+
+ また、アクションとメニューも翻訳する必要があります。
+ キーボードショートカット "Ctrl+Q" に対して使用している \c tr()
+ の第 2 引数は、このショートカットがどのような機能を有しているかを
+ 翻訳者に示す唯一の情報であることに注意してください。
+
+ \snippet examples/linguist/trollprint/main.cpp 0
+
+ \c main.cpp の \c main() 関数は、
+ \l{linguist/arrowpad}{アローパッド} の例の場合と同じになります。
+ 具体的には、現在のロケールに基づいて、翻訳ファイルを選択します。
+
+ \section1 英語とポルトガル語で Troll Print 1.0 を実行する
+
+ 既存の \c trollprint_pt.ts ファイルの翻訳を使用します。
+
+ \c LANG 環境変数を \c pt に設定して、\c trollprint を実行します。
+ QM ファイルがないため、スクリーンショットは英語版のままです。
+ ここで、\c lrelease (例: \c {lrelease trollprint.pro})を実行し、
+ サンプルを再実行します。
+ これで、ポルトガル語版(Troll Imprimir 1.0)になりました:
+
+ \image linguist-trollprint_10_pt_bad.png
+
+ 翻訳は正しく表示されていますが、誤りがあります。
+ 文法的に正しいポルトガル語では、
+ "Enabled" が2回目に使用されるときの正しい翻訳は、
+ "Ativado" ではなく "Ativadas" であり、
+ "Disabled" が2回目に翻訳されるときも、
+ 語尾を同様に変化させる必要があります。
+
+ \e {Qt Linguist} で \c trollprint_pt.ts を開くと、
+ ソースコードには "Enabled" と "Disabled" が2回ずつ使われていますが、
+ 翻訳ソースファイルでは1回ずつしか使われていません。
+ これは、\e {Qt Linguist} では、
+ ソーステキストが重複する場合は翻訳を流用することにより、
+ 翻訳者の作業を最小限に抑えようとするためです。
+ このように類似した翻訳に誤りがある場合、
+ プログラマは繰り返し使用する際に翻訳の曖昧さを排除する必要があります。
+ これは、2個の引数を取る\c tr() を使用することにより、
+ 容易に実行できます。
+
+ 実際には、翻訳者の"文脈"は変更する必要のある文字列が表示されるクラスに対するクラス名であるため、
+ どのファイルを変更すべきか簡単に特定できます。
+ この場合、ファイルは \c printpanel.cpp であり、
+ 変更すべき行は4行あります。
+ ラジオボタンの最初のペアの \c tr() 呼び出しに、2つ目の引数 "two-sided"(両面) をに追加します:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 0
+
+ そして、ラジオボタンの2番目のペアの \c tr() 呼び出しに、
+ 2つ目の引数 "colors"(色) を追加します。
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 1
+
+ ここで、\c lupdate を実行し、\e {Qt Linguist} で
+ \c trollprint_pt.ts を開きます。2 つの変更個所がわかるはずです。
+
+ まず、翻訳ソースファイルには、\e{3組}の "Enabled" と
+ "Disabled" のペアが含まれています。
+ 最初のペアは、既に利用されていないテキストであることを意味する灰色になっています。
+ これは、 \c tr() 内の文字列が第二引数を追加した新たな
+ \c tr() の文字列で置き換えられたからです。
+ 2番目のペアには、"two-sided"(両面) というコメントが含まれており、
+ 3番目のペアには、"colors"(色) というコメントが含まれています。
+ これらのコメントは、\e {Qt Linguist} に
+ \gui {開発者のコメント} として表示されます。
+
+ 次に、翻訳者の作業を最小限に抑えるために、
+ 新たに使用される "Enabled" と "Disabled" の文字列に対して、
+ 訳語 "Ativado" と "Desativado" が自動的に使用されます。
+ これらの訳語は、これらの原語が2回目に使用される場合の正しい翻訳ではありません。
+ ここからが、チュートリアルの出発点です。
+
+ 2番目の "Ativado" を "Ativadas" に、
+ 2番目の "Desativado" を "Desativadas" に変更し、保存して終了します。
+ \c lrelease を実行して最新のバイナリ \c trollprint_pt.qm ファイルを作成し、
+ Troll Print (または Troll Imprimir) を実行します。
+
+ \image linguist-trollprint_10_pt_good.png
+
+ \e {Qt Linguist} では "comments" と呼ばれる
+ \c tr() 呼び出しの2つ目の引数は、
+ 同じ文脈(クラス)で発生する類似したソーステキストを識別します。
+ コメントは、たとえば Ctrl キーによるキーボードショートカットが
+ ショートカットによって実行される機能を伝達する唯一の手段である場合等に、
+ 翻訳者に情報を提供するのに便利です。
+
+ 翻訳者に情報を提供する他の手段は、
+ 翻訳の必要があるソーステキストを含むアプリケーションの
+ 特定の部分への移動方法に関する情報を提供することです。
+ これにより、翻訳者は、翻訳が表示される文脈を確認し、
+ 翻訳を検索してテストを行うことができます。
+ これは、ソースコードで \c TRANSLATOR
+ コメントを使用して行います:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 2
+
+ 一部のソースファイル、特にダイアログクラスのコメントに
+ ダイアログに到達するまでに必要な操作を記述します。
+ また、\c mainwindow.cpp や \c printpanel.cpp など、
+ 適切なサンプルファイルにこれらを追加することもできます。
+ \c lupdate を実行して \e {Qt Linguist} を起動し、
+ \c trollprint_pt.ts を読み込みます。
+ ソーステキストの一覧を参照する際に、
+ \gui{ソーステキスト}と\gui{開発者のコメント}
+ の領域に表示されるコメントを確認できます。
+
+ 特に大きなプログラムでは、翻訳者が自分の翻訳を探し、
+ それが適切かどうかを確認することが困難な場合があります。
+ コメントは役立つナビゲーション情報を提供するため、
+ 翻訳に要する時間を節約できます:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 3
+
+ \section1 Troll Print 1.1
+
+ これから、Troll Print のバージョン 1.1 のリリースの準備を行います。
+ テキストエディターを起動して、次の手順に従って変更を行ってください:
+
+ \list
+ \o \c printpanel.cpp の文字列 "\<b\>TROLL PRINT\</b\>" を引数に
+ QLabel を作成する2つの行のコメントを解除します。
+ \o ソースの変更: \c printpanel.cpp で、"2-sided" を
+ "Two-sided" に置き換えます。
+ \o \c mainwindow.cpp で、すべての "1.0" を "1.1" に置き換えます。
+ \o \c mainwindow.cpp で、著作権表示の年号を 1999-2000 に更新します。
+ \endlist
+
+ (実際のアプリケーションでは、バージョン番号と著作権表示の年号は
+ const または #define をつかって定義するでしょう。)
+
+ 終了したら、\c lupdate を実行し、\e {Qt Linguist} で
+ \c trollprint_pt.ts を開きます。以下の項目は、特別なコンテンツです:
+
+ \list
+ \o \c MainWindow
+ \list
+ \o Troll Print 1.0 - 古いテキストとして灰色でマーク
+ \o About Troll Print 1.0 - 古いテキストとして灰色でマーク
+ \o Troll Print 1.0. Copyright 1999 Software, Inc. -
+ 古いテキストとして灰色でマーク
+ \o Troll Print 1.1 - 自動的に "Troll Imprimir 1.1" に翻訳(未完了)
+ \o About Troll Print 1.1 - 自動的に "Troll Imprimir 1.1" に翻訳(未完了)
+ \o Troll Print 1.1. Copyright 1999-2000 Software,
+ Inc. - 自動的に "Troll Imprimir 1.1.
+ Copyright 1999-2000 Software, Inc." に翻訳(未完了)
+ \endlist
+ \o \c PrintPanel
+ \list
+ \o 2-sided - 古いテキストとして灰色でマーク
+ \o \<b\>TROLL PRINT\</b\> - 未翻訳のテキストとして"?"マーク
+ \o Two-sided - 未翻訳のテキストとして"?"マーク
+ \endlist
+ \endlist
+
+ \c lupdate は、修正を容易に行い、数字の処理を効率的に行うために、
+ 様々な処理を行っています。
+
+ \c MainWindow の翻訳の見直しを行います。
+ "\<b\>TROLL PRINT\</b\>" を "\<b\>TROLL IMPRIMIR\</b\>" と翻訳します。
+ "Two-sided" を翻訳する際には、\gui{フレーズと推測} の欄から
+ "2-lados" をダブルクリックして訳に選択した後に、
+ "2" を "Dois" に変更します。
+
+ 保存して終了し、\c lrelease を実行します。
+ ポルトガル語版の表示は以下のようになります:
+
+ \image linguist-trollprint_11_pt.png
+
+ \gui{Ajuda|Sobre} (\gui{Help|About}) を選択し、
+ バージョン情報ボックスを確認します。
+
+ \gui{Ajuda|Sobre Qt} (\gui{Help|About Qt}) を選択した場合、
+ 英語版のダイアログが表示されます。
+ Qt の翻訳はまだ終わっていません。
+ 詳細については、\l{Internationalization with Qt} を参照してください。
+
+ ここで、\c LANG=en を設定し、元の英語版を実行してみてください:
+
+ \image linguist-trollprint_11_en.png
+*/
diff --git a/doc/src/ja_JP/getting-started/tutorials.qdoc b/doc/src/ja_JP/getting-started/tutorials.qdoc
new file mode 100644
index 0000000..701ba88
--- /dev/null
+++ b/doc/src/ja_JP/getting-started/tutorials.qdoc
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page tutorials.html
+ \title チュートリアル
+
+ \contentspage How to Learn Qt
+ \nextpage Qt Examples
+
+ \brief Qt の学習を助けるチュートリアルやガイドの概要
+
+ \nextpage Qt Examples
+
+ Qt で提供されているこれらのチュートリアルやガイドは
+ 新たに Qt の開発を始めるユーザの良い助けとなります。
+ これらのドキュメントでは ウィジェットの基本的な使い方から始まり
+ ステップバイステップでアプリケーションの使い方を学ぶことが出来ます。
+
+ \table
+ \row
+ \o{2,1} \l{ウィジェットのチュートリアル}{\bold ウィジェット}
+ \o{2,1} \l{チュートリアル: アドレス帳}{\bold {アドレス帳}}
+ \row
+ \o \image widget-examples.png Widgets
+ \o
+ ウィジェットとレイアウトを使って GUI アプリケーションを作成する
+ 初心者向けのガイドです。
+
+ \o \image addressbook-tutorial.png AddressBook
+ \o
+ 完全な機能を持つアドレス帳アプリケーションを作成する 7 章で構成されたガイドです。
+
+ \row
+ \o{2,1} \l{Qt Designer クイックガイド}{\bold{Qt Designer}}
+ \o{2,1} \l{Qt Linguist Manual: Programmers#Tutorials}{\bold {Qt Linguist}}
+ \row
+ \o \image designer-examples.png QtDesigner
+ \o
+ \QD を使ってフォームを生成する基本的な手順を説明するクイックガイドです。
+
+ \o \image linguist-examples.png QtLinguist
+ \o
+ \l{サンプル: こんにちは tr()}{こんにちは tr()}、
+ \l{サンプル: アローパッド}{アローパッド}、
+ \l{サンプル: トロールプリント}{トロールプリント}
+ の三例を通じて翻訳の方法を説明します。
+
+ \row
+ \o{2,1} \l{QTestLib チュートリアル}{\bold QTestLib}
+ \o{2,1} \l{qmake チュートリアル}{\bold qmake}
+ \row
+ \o{2,1}
+ Qt のユニットテストフレームワークである QTestLib の機能の初歩的な使い方を説明するチュートリアルです。
+ このチュートリアルは4章で構成されています。
+
+ \o{2,1}
+ \c qmake の使い方を説明するチュートリアルです。
+ このチュートリアルを卒業した後は \l{qmake Manual}{qmake user guide}(英語)
+ を読むことをお勧めします。
+
+ \endtable
+*/
diff --git a/doc/src/ja_JP/images/linguist-hellotr_en.png b/doc/src/ja_JP/images/linguist-hellotr_en.png
new file mode 100644
index 0000000..05aa945
--- /dev/null
+++ b/doc/src/ja_JP/images/linguist-hellotr_en.png
Binary files differ
diff --git a/doc/src/ja_JP/images/linguist-hellotr_ja.png b/doc/src/ja_JP/images/linguist-hellotr_ja.png
new file mode 100644
index 0000000..d9beb01
--- /dev/null
+++ b/doc/src/ja_JP/images/linguist-hellotr_ja.png
Binary files differ
diff --git a/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc b/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc
new file mode 100644
index 0000000..e05cd12
--- /dev/null
+++ b/doc/src/ja_JP/snippets/code/doc_src_examples_hellotr.qdoc
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+lupdate -verbose hellotr.pro
+//! [0]
+
+
+//! [1]
+<!DOCTYPE TS><TS>
+<context>
+ <name>QPushButton</name>
+ <message>
+ <source>Hello world!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
+//! [1]
+
+
+//! [2]
+linguist hellotr_ja.ts
+//! [2]
+
+
+//! [3]
+<translation type='unfinished'></translation>
+//! [3]
+
+
+//! [4]
+<translation>こんにちは、世界!</translation>
+//! [4]
diff --git a/doc/src/ja_JP/tutorials/addressbook.qdoc b/doc/src/ja_JP/tutorials/addressbook.qdoc
new file mode 100644
index 0000000..9fb1059
--- /dev/null
+++ b/doc/src/ja_JP/tutorials/addressbook.qdoc
@@ -0,0 +1,1070 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page tutorials-addressbook.html
+
+ \title チュートリアル: アドレス帳
+ \brief シンプルだが、完全な機能を持つアプリケーションの作成を通じた
+ GUI プログラミングへの導入。
+
+ このチュートリアルでは、Qt クロスプラットフォームフレームワークを使用した
+ GUI プログラミングの概要について説明しています。
+
+ \image addressbook-tutorial-screenshot.png
+
+ \omit
+ It doesn't cover everything; the emphasis is on teaching the programming
+ philosophy of GUI programming, and Qt's features are introduced as needed.
+ Some commonly used features are never used in this tutorial.
+ \endomit
+
+ このチュートリアルでは以下に示す Qt の基本的な機能を学ぶことが出来ます:
+
+ \list
+ \o ウィジェットとレイアウトマネージャ
+ \o コンテナクラス
+ \o シグナル/スロット
+ \o 入力デバイスと出力デバイス
+ \endlist
+
+ Qt を初めて利用する方は、最初に \l{How to Learn Qt} をご覧ください。
+
+ チュートリアルの目次:
+
+ \list 1
+ \o \l{tutorials/addressbook/part1}{ユーザインターフェースの設計}
+ \o \l{tutorials/addressbook/part2}{アドレスの追加}
+ \o \l{tutorials/addressbook/part3}{項目間のナビゲーション}
+ \o \l{tutorials/addressbook/part4}{アドレスの編集と削除}
+ \o \l{tutorials/addressbook/part5}{検索機能の追加}
+ \o \l{tutorials/addressbook/part6}{読み込みと保存}
+ \o \l{tutorials/addressbook/part7}{その他の機能}
+ \endlist
+
+ このチュートリアルのソースコードは、Qt の
+ \c examples/tutorials/addressbook ディレクトリに置かれています。
+
+ この小さなアプリケーションは本格的な最新の GUI
+ アプリケーションのようには見えませんが、
+ 複雑なアプリケーションで使用される多くの基本的な技術が採用されています。
+ このチュートリアルが終わったら、
+ メニューやツールバー、ステータスバーなどを表示する
+ 小さな GUI アプリケーションである
+ \l{mainwindows/application}{Application}
+ のサンプルをチェックすることをお勧めします。
+
+*/
+
+/*!
+ \page tutorials-addressbook-part1.html
+
+ \example tutorials/addressbook/part1
+ \title 第1章 - ユーザインターフェースのデザイン
+
+ 本チュートリアルの第1章では
+ アドレス帳アプリケーションで使用する基本的なインターフェース
+ (GUI) の設計について説明します。
+
+ GUI プログラム作成の最初のステップは、
+ ユーザインターフェースを設計することです。
+ 本章の目標は、基本的なアドレス帳アプリケーションを実装するのに必要な
+ ラベルと入力フィールドを設定することです。
+ 下図は、ここで作成しようとしているアドレス帳のスクリーンショットです。
+
+ \image addressbook-tutorial-part1-screenshot.png
+
+ ユーザがアドレス帳に名前や住所を入力できるようにするには、
+ 2つの QLabel のオブジェクトである \c nameLabel 及び \c addressLabel と、
+ 入力フィールドとして QLineEdit オブジェクトの \c nameLine と
+ QTextEdit オブジェクトの \c addressText が必要です。
+ 使用するウィジェットとその配置は下図に示してあります。
+
+ \image addressbook-tutorial-part1-labeled-screenshot.png
+
+ 以下の3つのファイルを使用してこのアドレス帳を実装します:
+
+ \list
+ \o \c{addressbook.h} - \c AddressBook クラスを宣言するファイル、
+ \o \c{addressbook.cpp} - \c AddressBook クラスを実装するファイル、
+ \o \c{main.cpp} - \c AddressBook クラスのインスタンスを持つ
+ \c main() 関数を含むファイル。
+ \endlist
+
+ \section1 Qt プログラミング - 派生クラスの作成
+
+ Qt プログラムを作成する際は、
+ 通常 Qt オブジェクトの派生クラスを作成して機能を追加します。
+ これは、カスタムウィジットや標準的なウィジェットの集合体を作成する場合の
+ 重要なコンセプトの1つです。
+ ウィジェットの挙動の拡張や変更のために派生クラスを作成することには
+ 以下のような利点があります:
+
+ \list
+ \o 仮想関数または純粋仮想関数の実装を行って要求される機能を実装できます。
+ 必要によっては基底クラスの実装にフォールバックして利用できます。
+
+ \o これにより、アプリケーションのその他の部分が
+ ユーザインターフェースの個々のウィジェットを指定する必要がないよう、
+ ユーザインターフェースの一部をクラス内にカプセル化できます。
+
+ \o 派生クラスは、同一のアプリケーションまたはライブラリに
+ 複数のカスタムウィジットを作成するために使用できます。
+ また、派生クラスのコードは、他のプロジェクトで再利用可能です。
+
+ \endlist
+
+ Qt ではアドレス帳ウィジェットを提供していないため、
+ 標準的な Qt ウィジェットクラスを継承して機能を追加します。
+ 本チュートリアルで作成する \c AddressBook クラスは、
+ 基本的なアドレス帳ウィジェットが必要な場合に再利用できます。
+
+ \section1 AddressBook クラスの宣言
+
+ \l{tutorials/addressbook/part1/addressbook.h}{\c addressbook.h}
+ ファイルは、 \c AddressBook クラスを宣言するために使用します。
+
+ ここでは \c AddressBook を QWidget の派生クラスとし、
+ コンストラクタを宣言することから始めます。
+ また、 Q_OBJECT マクロを使用して、クラスで多言語化機能及び、
+ Qt のシグナル/スロット機能が使われていることを示します。
+ ただし、現段階ではこれらの機能の全てを使わない場合もあります。
+
+ \snippet tutorials/addressbook/part1/addressbook.h class definition
+
+ クラスは、 前述した QLineEdit と QTextEdit のプライベートなインスタンス
+ \c nameLine と \c addressText の宣言を保有します。
+ 後述の章で、 \c nameLine 及び \c addressText に保存したデータが、
+ 多くのアドレス帳の機能で必要になることがわかるでしょう。
+
+ 我々が使用する QLabel オブジェクトは、
+ 一旦作成すると後で参照する必要がないため、宣言する必要はありません。
+ Qt でオブジェクトの所有権を追跡する方法については、次節で説明します。
+
+ Q_OBJECT マクロ自体は、Qt のより高度な機能を実装します。
+ ここでは、 Q_OBJECT マクロを、 \l{QObject::}{tr()} 及び
+ \l{QObject::}{connect()} 関数を使用可能にする
+ ショートカットとみなしたほうが良いでしょう。
+
+ これで、 \c addressbook.h ファイルが完成しました。
+ 次は対応する \c addressbook.cpp ファイルの実装を行います。
+
+ \section1 AddressBook クラスの実装
+
+ \c AddressBook のコンストラクタは、 \a{parent} パラメータとして
+ QWidget を受け取ります。
+ 慣例により、このパラメータを基底クラスのコンストラクタに渡します。
+ 親が複数の子を所有できるというこの所有概念は、
+ Qt でウィジェットのグループ化を行う場合に有用です。
+ 例えば、親を削除すると、親に属する子も全て削除されます。
+
+ \snippet tutorials/addressbook/part1/addressbook.cpp constructor and input fields
+
+ このコンストラクタ内で、 \c nameLine と \c addressText のインスタンスを生成し、
+ 2つのローカル QLabel オブジェクトの \c nameLabel と \c addressLabel
+ を宣言し、そのインスタンスを生成します。
+ \l{QObject::tr()}{tr()} 関数は、
+ 翻訳した文字列が存在する場合にそれを返します。
+ そうでない場合は、引数の文字列自体を返します。
+ この関数は文字列が他の言語に翻訳されるようにマークする役目を持ちます。
+ 翻訳可能な文字列を使用するたびに、マークしてください。
+
+ Qt を使用してプログラミングを行う場合、
+ レイアウトが機能する仕組みを理解していると便利です。
+ Qt は主に、以下の3つのレイアウトクラスを提供します。
+ ウィジェットの配置を処理するための QHBoxLayout 、 QVBoxLayout 及び
+ QGridLayout です。
+
+ \image addressbook-tutorial-part1-labeled-layout.png
+
+ ここでは、 QGridLayout を使って、
+ ラベルと入力フィールドを配置します。
+ QGridLayout は、有効なスペースを格子状に分割し、
+ 行/列番号により指定するセルに、ウィジェットを配置します。
+ 上図は、レイアウトセルとウィジェットの位置を示しており、
+ 以下のコードを使用して、この配置を指定します:
+
+ \snippet tutorials/addressbook/part1/addressbook.cpp layout
+
+ \c addressLabel は、追加引数として Qt::AlignTop を用いて配置されていることに注意してください。
+ これは、セル(1,0) で縦方向の中央に配置されないようにするためです。
+ Qt のレイアウトにおける基本概念については、
+ \l{Layout Management} のドキュメントをご覧ください。
+
+ ウィジェットにレイアウトオブジェクトをインストールするには、
+ ウィジェットの \l{QWidget::setLayout()}{setLayout()}
+ 関数を呼び出す必要があります。
+
+ \snippet tutorials/addressbook/part1/addressbook.cpp setting the layout
+
+ 最後に、ウィジェットのタイトルを "Simple Address Book" とします。
+
+ \section1 アプリケーションを実行する
+
+ 別のファイル \c main.cpp に、 \c main() 関数に実装します。
+ この関数内で、QApplication である \c app のインスタンスを生成します。
+ QApplication は、既定のフォントやカーソルなど
+ アプリケーションに共通な複数のリソース及び、
+ イベントループの実行に関与しています。
+ 従って、Qt を使用する全ての GUI アプリケーションでは、
+ 必ず QApplication が存在します。
+
+ \snippet tutorials/addressbook/part1/main.cpp main function
+
+ スタックに新しい \c AddressBook ウィジェットを生成し、
+ \l{QWidget::show()}{show()} 関数を呼び出して表示します。
+ ただし、ウィジェットはアプリケーションのイベントループが
+ 開始されるまで表示されません。
+ アプリケーションの \l{QApplication::}{exec()} 関数を呼び出して、
+ イベントループを開始します。
+ この関数により返された結果は、 \c main() 関数の戻り値として使用されます。
+ この時点で、スタックで \c AddressBook
+ をインスタンス化した理由が明らかになります。
+ イベントループが終了すると \c main() 関数のスコープの外に移動します。
+ それに伴って \c AddressBook 及び、
+ これに属する全ての子ウィジェットが削除されるため、
+ メモリリークを防ぐことができます。
+*/
+
+/*!
+ \page tutorials-addressbook-part2.html
+
+ \example tutorials/addressbook/part2
+ \title 第2章 - アドレスの追加
+
+ 基本的なアドレス帳アプリケーションを作成するための次の手順は、
+ ユーザからの操作を可能にすることです。
+
+ \image addressbook-tutorial-part2-add-contact.png
+
+ 新しい連絡先を追加するために、
+ ユーザがクリックするプッシュボタンを作成します。
+ また、これらの連絡先を整理して保存するために、
+ 何らかのデータ構造が必要になります。
+
+ \section1 AddressBook クラスの宣言
+
+ ラベルと入力フィールドの設定が完了しているため、
+ 連絡先を追加する際に必要なプッシュボタンを追加します。
+ \c addressbook.h ファイルに、
+ 3つの QPushButton オブジェクトを宣言し、
+ 対応する3つの public slot を作成します。
+
+ \snippet tutorials/addressbook/part2/addressbook.h slots
+
+ スロットとは特定のシグナルに応答して呼び出される関数をいいます。
+ このコンセプトについては、 \c AddressBook
+ クラスを実装する際にさらに詳細に取り上げます。
+ なお、Qt のシグナル/スロットのコンセプトの概要については、
+ \l{Signals and Slots} のドキュメントを参照してください。
+
+ 3つの QPushButton オブジェクト \c addButton 、 \c submitButton 、
+ \c cancelButton は、前章の \c nameLine と \c addressText とともに、
+ プライベート変数宣言に含まれています。
+
+ \snippet tutorials/addressbook/part2/addressbook.h pushbutton declaration
+
+ アドレス帳の連絡先を横断して表示するには、
+ 連絡先保持用のコンテナが必要です。
+ QMap のオブジェクトである \c contacts をこの目的に使用します。
+ \c contacts にはキーとして連絡先の名前 \e key
+ とそれに対応する値として連絡先の住所 \e value を格納します。
+
+ \snippet tutorials/addressbook/part2/addressbook.h remaining private variables
+
+ QString の2つのプライベートオブジェクトとして \c oldName と \c oldAddress
+ も宣言します。
+ これらのオブジェクトは、ユーザが \gui Add
+ をクリックする前に最後に表示した連絡先の名前と住所が含まれている必要があります。
+ ユーザが \gui Cancel
+ をクリックすると、最後に表示した連絡先の詳細に戻って表示することが出来ます。
+
+ \section1 AddressBook クラスの実装
+
+ \c AddressBook のコンストラクタ内で、連絡先の詳細を編集することなく
+ 表示のみを行えるよう、 \c nameLine と \c addressText
+ を読み取り専用に設定します。
+
+ \dots
+ \snippet tutorials/addressbook/part2/addressbook.cpp setting readonly 1
+ \dots
+ \snippet tutorials/addressbook/part2/addressbook.cpp setting readonly 2
+
+ 次に、プッシュボタン \c addButton 、 \c submitButton 、 \c cancelButton
+ のインスタンスを生成します。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp pushbutton declaration
+
+ \c addButton を、 \l{QPushButton::show()} 関数を呼び出して表示します。
+ \c submitButton と \c cancelButton は、
+ \l{QPushButton::hide()}{hide()} を呼び出して非表示にします。
+ これら2つのプッシュボタンはユーザが \gui Add
+ をクリックした場合にのみ表示され、後に説明する
+ \c addContact() によって処理されます。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp connecting signals and slots
+
+ 各プッシュボタンの \l{QPushButton::clicked()}{clicked()} を、
+ それぞれのスロットに接続します。
+ 下図はこれを説明したものです。
+
+ \image addressbook-tutorial-part2-signals-and-slots.png
+
+ 次に、 QVBoxLayout を使用して、
+ アドレス帳ウィジェットの右側にプッシュボタンを
+ 上下一列に配置します。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp vertical layout
+
+ \l{QBoxLayout::addStretch()}{addStretch()} 関数は、
+ プッシュボタンを等間隔に並べるのではなく、
+ ウィジェット上部に近づけて配置するために使用します。
+ 下図は、\l{QBoxLayout::addStretch()}{addStretch()} を使用した場合と、
+ 使用しない場合の違いを示しています。
+
+ \image addressbook-tutorial-part2-stretch-effects.png
+
+ 次に、\l{QGridLayout::addLayout()}{addLayout()} を使用して、
+ \c buttonLayout1 を \c mainLayout に追加します。
+ \c buttonLayout1 は \c mainLayout の子となり、
+ レイアウトが入れ子になりました。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp grid layout
+
+ レイアウトの配置は以下のようになります:
+
+ \image addressbook-tutorial-part2-labeled-layout.png
+
+ \c addContact() では、最後に表示した連絡先の詳細を、
+ \c oldName と \c oldAddress に保存します。
+ 次に、これらの入力フィールドをクリアし、読み取り専用モードを解除します。
+ \c nameLine にフォーカスをセットして、 \c submitButton と \c cancelButton を表示します。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp addContact
+
+ \c submitContact() 関数は、以下の次の3つの要素から成ります:
+
+ \list 1
+
+ \o \c nameLine 及び \c addressText から連絡先の詳細を抽出し、
+ QString オブジェクトに保存します。
+ また、ユーザが入力フィールドに何も入力せずに
+ \gui Submit をクリックしないよう確認します。
+ どちらかのフィールドが空であれば、ユーザに名前と住所の入力を求める
+ QMessageBox が表示されます。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part1
+
+ \o 続けて、連絡先が既に存在するかどうか確認します。
+ 存在しない場合は \c contacts に連絡先を追加して QMessageBox を表示し、
+ 連絡先が追加されたことをユーザに知らせます。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part2
+
+ 連絡先が既に存在する場合、 QMessageBox を表示し、
+ 連絡先が重複して追加されないように
+ 連絡先が存在することをユーザに知らせます。
+ \c contacts オブジェクトは、名前と住所のキー値のペアで構成されているため、
+ \e key が一意であることを確認します。
+
+ \o 上記の両方の事例に対処したら、
+ 以下のコードを使ってプッシュボタンを通常の状態に戻します:
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part3
+
+ \endlist
+
+ 以下のスクリーンショットは、ユーザに情報メッセージを表示するために使用する
+ QMessageBox オブジェクトです。
+
+ \image addressbook-tutorial-part2-add-successful.png
+
+ \c cancel() 関数は、最後に表示した連絡先の詳細を復元して
+ \c addButton を有効にし、 \c submitButton と \c cancelButton
+ を非表示にします。
+
+ \snippet tutorials/addressbook/part2/addressbook.cpp cancel
+
+ 連絡先を追加する際の概念は、ユーザがいつでも自由に
+ \gui{送信} または \gui{キャンセル} をクリックできるようにすることです。
+ 以下のフローチャートは、この概念を詳細に説明しています:
+
+ \image addressbook-tutorial-part2-add-flowchart.png
+*/
+
+/*!
+ \page tutorials-addressbook-part3.html
+
+ \example tutorials/addressbook/part3
+ \title 第3章 - 項目間のナビゲーション
+
+ アドレス帳アプリケーションは、半分完成しました。
+ 次に表示する連絡先を変更するために、いくつかの関数を追加します。
+ しかし、最初に、これらの連絡先を保存するために使用するデータ構造の種類を決める必要があります。
+
+ 第2章では、連絡先の名前 \e key 及び、連絡先の住所 \e value
+ の鍵と値のペアで QMap を使用しました。
+ これは、この事例で使用するのに適した構造です。
+ ただし、各項目間を移動して表示するには、多少の機能拡張が必要です。
+
+ QMap を、最初の要素と最後の要素を含むすべての要素が接続された
+ 循環リストに似たデータ構造に、機能拡張します。
+ 下図はこのデータ構造を説明したものです。
+
+ \image addressbook-tutorial-part3-linkedlist.png
+
+ \section1 AddressBook クラスの宣言
+
+ アドレス帳アプリケーションにナビゲーション機能を追加するには、
+ \c AddressBook クラスに2つのスロットを追加する必要があります。
+ next() 及び \c previous() を
+ \c addressbook.h ファイルに追加します。
+
+ \snippet tutorials/addressbook/part3/addressbook.h navigation functions
+
+ また、新たに2つの QPushButton オブジェクトが必要になります。
+ プライベート変数として
+ \c nextButton と \c previousButton を宣言します。
+
+ \snippet tutorials/addressbook/part3/addressbook.h navigation pushbuttons
+
+ \section1 AddressBook クラスの実装
+
+ \c addressbook.cpp の \c AddressBook コンストラクタでは、
+ \c nextButton と \c previousButton のインスタンスを生成し
+ 初期設定で無効にします。
+ これは、アドレス帳に複数の連絡先が存在しない場合、
+ ナビゲーションを有効にしないためです。
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp navigation pushbuttons
+
+ これらのプッシュボタンを、それぞれスロットに接続します:
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals
+
+ 以下の画像は、ここで作成しようとしている
+ グラフィカルユーザインターフェースです。
+ 最終アプリケーションが完成間近であることがわかるでしょう。
+
+ \image addressbook-tutorial-part3-screenshot.png
+
+ \c next() と \c previous() では基本的な規約に従って、
+ \c nextButton を右側に、 \c previousButton を左側に配置します。
+ 直感的でわかりやすいレイアウトに仕上げるために、
+ QHBoxLayout を使用してウィジェットを横に並べて配置します:
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp navigation layout
+
+ 次に、 \c mainLayout に、QHBoxLayout のオブジェクトである
+ \c buttonLayout2 を追加します。
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp adding navigation layout
+
+ 下図は、 \c mainLayout のウィジェットの配置を示します。
+ \image addressbook-tutorial-part3-labeled-layout.png
+
+ \c addContact() 関数内部では、
+ ユーザが連絡先を追加しているときに移動しないよう、
+ これらのボタンを無効にする必要があります。
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp disabling navigation
+
+ また、 \c submitContact() 関数では、 \c contacts のサイズに応じて、
+ ナビゲーションボタン \c nextButton 及び \c previousButton を有効にします。
+ 前述のように、アドレス帳に複数の連絡先が存在しない場合は、
+ ナビゲーションを有効にできません。
+ 以下のコードは、その処理方法を示しています。
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp enabling navigation
+
+ \c cancel() 関数にも、これらの処理を含めます。
+
+ ここで、QMap のオブジェクト \c contacts を使って、
+ 循環リストをエミュレートしましょう。
+ \c next() 関数で、 \c contacts のイテレータを作成し、次に:
+
+ \list
+ \o イテレータが \c contacts の末尾にない場合は、次の項目に移動します。
+
+ \o イテレータが \c contacts の末尾にある場合は、
+ \c contacts の先頭に移動します。
+ これによって、QMap が循環リストのように機能するという印象を与えます。
+ \endlist
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp next() function
+
+ \c contacts 内の正しいオブジェクトに移動したら、
+ \c nameLine と \c addressText に内容を表示します。
+
+ 同様に、 \c previous() 関数で、 \c contacts のイテレータを作成し、次に:
+ \list
+ \o イテレータが \c contacts の末尾にある場合は、
+ 表示をクリアして戻ります。
+
+ \o イテレータが \c contacts の先頭にある場合は、末尾に移動します。
+
+ \o イテレータを直前の項目に移動します。
+ \endlist
+
+ \snippet tutorials/addressbook/part3/addressbook.cpp previous() function
+
+ もう一度、 \c contacts に現在のオブジェクトの内容を表示します。
+*/
+
+/*!
+ \page tutorials-addressbook-part4.html
+
+ \example tutorials/addressbook/part4
+ \title 第4章 - アドレスの編集と削除
+
+ 本章では、アドレス帳アプリケーションに保存されている
+ 連絡先の内容を変更する方法について説明します。
+
+ \image addressbook-tutorial-screenshot.png
+
+ ここでは、連絡先を整理して保存するだけでなく、
+ ナビゲーションが可能なアドレス帳を作成します。
+ 必要に応じて連絡先の詳細を変更できるよう、
+ 編集・削除機能を追加すると便利です。
+ ただし、列挙型書式の若干の改善が必要になります。
+ 前章では、次の2つのモードを扱いました:
+ \c AddingMode 及び \c NavigationMode -
+ ただし、これらは列挙型として定義しませんでした。
+ 代わりに、対応するボタンを手動で有効または無効にし、
+ 複数行のコードを繰り返します。
+
+ 本章では、以下のような2つの異なる値を持つ \c Mode 列挙型を定義します:
+
+ \list
+ \o \c{NavigationMode}
+ \o \c{AddingMode}
+ \o \c{EditingMode}
+ \endlist
+
+ \section1 AddressBook クラスの宣言
+
+ \c addressbook.h ファイルをアップデートし、 \c Mode 列挙型を追加します:
+
+ \snippet tutorials/addressbook/part4/addressbook.h Mode enum
+
+ また、public slot として2つの新しいスロット
+ \c editContact() 及び \c removeContact() を追加します。
+
+ \snippet tutorials/addressbook/part4/addressbook.h edit and remove slots
+
+ モードを切り替えるために、すべての QPushButton オブジェクトの
+ 有効化/無効化を制御する \c updateInterface() 関数を導入します。
+ また、前述の編集と削除を行うスロット用に、2つの新しいボタン
+ \c editButton 及び \c removeButton を追加します。
+
+ \snippet tutorials/addressbook/part4/addressbook.h updateInterface() declaration
+ \dots
+ \snippet tutorials/addressbook/part4/addressbook.h buttons declaration
+ \dots
+ \snippet tutorials/addressbook/part4/addressbook.h mode declaration
+
+ 最後に、現在のモードを保持する列挙型の \c currentMode を宣言します。
+
+ \section1 AddressBook クラスの実装
+
+ ここで、アドレス帳アプリケーションのモード変更機能を実装する必要があります。
+ アドレス帳をはじめて起動するときは、
+ メモリに連絡先が保存されていないため、
+ コンストラクタでは、 \c editButton 及び \c removeButton
+ のインスタンスの生成と無効化を行います。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp edit and remove buttons
+
+ また、ボタンをそれぞれのスロット \c editContact() 及び \c removeContact()
+ に接続し、 \c buttonLayout1 に追加します。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp connecting edit and remove
+ \dots
+ \snippet tutorials/addressbook/part4/addressbook.cpp adding edit and remove to the layout
+
+ \c editContact() は、モードを \c EditingMode に切り替える前に、
+ 連絡先の古い詳細情報を、 \c oldName と \c oldAddress に保存します。
+ このモードでは、 \c submitButton と \c cancelButton
+ の両方が有効になるため、ユーザは連絡先の詳細を変更し、
+ どちらか一方のボタンをクリックできます。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp editContact() function
+
+ \c submitContact() 関数は、 \c{if-else} ステートメントにより、
+ 2つの処理に分割しています。
+ \c currentMode が \c AddingMode であるかどうかを確認します。
+ その場合、連絡先追加の処理を行います。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function beginning
+ \dots
+ \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part1
+
+ \c AddingMode でない場合、 \c currentMode が \c EditingMode
+ であるかどうか確認します。
+ その場合、 \c oldName を \c name と比較します。
+ 名前を変更した場合、 \c contacts から古い連絡先を削除し、
+ 新たに更新した連絡先を挿入します。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part2
+
+ 住所のみを変更した場合 (たとえば、 \c oldAddress は \c address と異なる)、
+ 連絡先の住所を更新します。
+ 最後に、 \c currentMode を \c NavigationMode に設定します。
+ これは、無効にしたプッシュボタンをすべて再び有効にするための重要なステップです。
+
+ アドレス帳から連絡先の削除を行う
+ \c removeContact() 関数を実装します。
+ この関数では、まず連絡先が \c contacts に存在するかどうか確認します。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp removeContact() function
+
+ 存在する場合、ユーザに削除を確認するために、QMessageBox を表示します。
+ ユーザが確認したら、 \c previous() を呼び出して、
+ ユーザインターフェースで他の連絡先を表示できることを確認し、
+ QMap の \l{QMap::remove()}{remove()} 関数を使用して連絡先を削除します。
+ 念のため、QMessageBox を表示してユーザに知らせます。
+ この関数で使用するメッセージボックスを以下に示します:
+
+ \image addressbook-tutorial-part4-remove.png
+
+ \section2 ユーザインターフェースを更新する
+
+ 既に、 \c updateInterface() 関数が
+ 現在のモードに応じてプッシュボタンの有効化と無効化を行うための
+ 手段であることを説明しました。
+ この関数は、渡される \c mode 引数に応じて現在のモードを更新します。
+ なお、引数の値を確認する前に \c currentMode に代入しています。
+
+ このとき、それぞれのプッシュボタンは、
+ 現在のモードに応じて有効または無効になります。
+ \c AddingMode 及び \c EditingMode でのコードを以下に示します:
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 1
+
+ \c NavigationMode の場合、 QPushButton::setEnabled()
+ 関数のパラメータに条件を含めます。
+ これは、アドレス帳に少なくとも1つ以上の連絡先が存在する場合に、
+ \c editButton と \c removeButton が有効であることを確認するためのものです。
+ \c nextButton と \c previousButton は、
+ アドレス帳に少なくとも2つ以上の連絡先が存在する場合にのみ有効になります。
+
+ \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 2
+
+ モードの設定及び、同一関数内でのユーザインターフェースの更新を行うタスクを実行することにより、
+ アプリケーションの内部状態により
+ ユーザインターフェースが「非同期」になる可能性を防ぎます。
+*/
+
+/*!
+ \page tutorials-addressbook-part5.html
+
+ \example tutorials/addressbook/part5
+ \title 第5章 - 検索機能の追加
+
+ 本章では、アドレス帳アプリケーションの連絡先と住所を
+ 検索する方法について説明します。
+
+ \image addressbook-tutorial-part5-screenshot.png
+
+ アドレス帳アプリケーションへ連絡先の追加を繰り返すと、
+ \e Next 及び \e Previous ボタンによる連絡先のナビゲートが面倒になります。
+ この場合、\e{検索(Find)}機能を使うと、
+ 連絡先の検索をより効率的に行うことができます。
+ 上記スクリーンショットは、\e Find ボタン及び、
+ パネル上のボタンの位置を示します。
+
+ ユーザーが \e Find ボタンをクリックすると、
+ 連絡先の名前の入力を求めるダイアログを表示します。
+ Qt が提供する QDialog クラスを継承して \c FindDialog クラスを導入します。
+
+ \section1 FindDialog クラスの宣言
+
+ \image addressbook-tutorial-part5-finddialog.png
+
+ QDialog を継承するには、最初に、QDialog のヘッダーを
+ \c finddialog.h ファイルで include する必要があります。
+ また、これらのウィジェットをダイアログクラスで使用するため、
+ 前方宣言を使用して QLineEdit と QPushButton を宣言します。
+
+ \c AddressBook クラスと同様に、 \c FindDialog クラスには Q_OBJECT
+ マクロが含まれ、ダイアログが別のウィンドウとして開かれる場合でも、
+ コンストラクタは親 QWidget を取るように定義されます。
+
+ \snippet tutorials/addressbook/part5/finddialog.h FindDialog header
+
+ \c FindDialog のインスタンスを保持するクラスにより使用される
+ パブリック関数 \c getFindText() を定義します。
+ この関数を経由してユーザが入力した検索文字列を取得します。
+ また、ユーザが \gui Find ボタンをクリックしたときに検索文字列を処理するために、
+ public slot として \c findClicked() を定義します。
+
+ 最後に、\gui Find ボタンに対応するプライベート変数として \c findButton 、
+ ユーザが検索文字列を入力するラインエディット \c lineEdit 及び、
+ 後の作業で使用する検索文字列を保存するために使用する内部文字列として
+ \c findText の定義を行います。
+
+ \section1 FindDialog クラスの実装
+
+ \c FindDialog のコンストラクタ内で、プライベート変数の
+ \c lineEdit 、 \c findButton 及び \c findText を設定します。
+ QHBoxLayout を用いてウィジェットを配置します。
+
+ \snippet tutorials/addressbook/part5/finddialog.cpp constructor
+
+ シグナルをそれぞれのスロットに接続し、
+ レイアウトとウィンドウのタイトルを設定します。
+ \c findButton の \l{QPushButton::clicked()} シグナルは、
+ \c findClicked() と \l{QDialog::accept()}{accept()}
+ に接続されていることがわかります。
+ QDialog により提供される \l{QDialog::accept()}{accept()} スロットは
+ ダイアログを非表示にして、結果コードを \l{QDialog::}{Accepted}
+ に設定します。
+ この関数を使用して、 \c AddressBook の \c findContact() 関数に、
+ \c FindDialog オブジェクトが閉じていることを知らせます。
+ この論理については、 \c findContact() 関数について取り上げる際に、
+ さらに詳細に説明します。
+
+ \image addressbook-tutorial-part5-signals-and-slots.png
+
+ \c findClicked() で、ユーザが連絡先の名前を入力せずに
+ \gui Find ボタンをクリックしたかどうか確認するために
+ \c lineEdit を検証します。
+ 次に、 \c lineEdit から抽出した検索文字列を \c findText に設定します。
+ その後、 \c lineEdit のコンテンツをクリアし、ダイアログを非表示にします。
+
+ \snippet tutorials/addressbook/part5/finddialog.cpp findClicked() function
+
+ \c findText 変数用のパブリックな取得関数
+ \c getFindText() を実装します。
+ コンストラクタ及び \c findClicked() 関数でのみ
+ \c findText を直接設定するため、
+ \c getFindText() に対応する設定関数は作成しません。
+ \c getFindText() はパブリックであるため、インスタンスを生成し
+ \c FindDialog を使用するクラスは、
+ ユーザが入力して確定した検索文字列にいつでもアクセスできます。
+
+ \snippet tutorials/addressbook/part5/finddialog.cpp getFindText() function
+
+ \section1 AddressBook クラスの宣言
+
+ \c AddressBook クラス内部から \c FindDialog を使用できるよう、
+ \c addressbook.h ファイルに \c finddialog.h を含めます。
+
+ \snippet tutorials/addressbook/part5/addressbook.h include finddialog's header
+
+ これまでのところ、アドレス帳の全機能に、
+ QPushButton とそのボタンに対応するスロットが含まれています。
+ 同様に、\gui{検索(Find)}機能には、
+ \c findButton 及び \c findContact() が含まれています。
+
+ \c findButton はプライベート変数として宣言され、
+ \c findContact() 関数は public slot として宣言されます。
+
+ \snippet tutorials/addressbook/part5/addressbook.h findContact() declaration
+ \dots
+ \snippet tutorials/addressbook/part5/addressbook.h findButton declaration
+
+ 最後に、 \c FindDialog のインスタンスを参照するためのプライベート変数
+ \c dialog を宣言します。
+
+ \snippet tutorials/addressbook/part5/addressbook.h FindDialog declaration
+
+ インスタンス化されたダイアログは複数回使用します。
+ プライベート変数を使用すると、
+ クラスの複数の場所から参照できるようになります。
+
+ \section1 AddressBook クラスの実装
+
+ \c AddressBook クラスのコンストラクタ内で、
+ プライベートオブジェクトの \c findButton と \c findDialog
+ のインスタンスを生成します:
+
+ \snippet tutorials/addressbook/part5/addressbook.cpp instantiating findButton
+ \dots
+ \snippet tutorials/addressbook/part5/addressbook.cpp instantiating FindDialog
+
+ 次に、 \c findButton の \l{QPushButton::clicked()}{clicked()} シグナルを、
+ \c findContact() に接続します。
+
+ \snippet tutorials/addressbook/part5/addressbook.cpp signals and slots for find
+
+ 後は、 \c findContact() 関数のコードだけです:
+
+ \snippet tutorials/addressbook/part5/addressbook.cpp findContact() function
+
+ \c FindDialog インスタンスの \c dialog を表示することから始めます。
+ これは、ユーザが検索用に連絡先の名前を入力するためのものです。
+ ユーザがダイアログの \c findButton をクリックすると
+ ダイアログが非表示になり、結果コードが QDialog::Accepted に設定されます。
+ これにより、 \c if ステートメントが常に真になります。
+
+ 続けて、検索文字列の抽出を行います。
+ この場合、検索文字列は \c contactName で、
+ \c FindDialog の \c getFindText() 関数を使用して取得します。
+ アドレス帳に連絡先が存在する場合、直ちに表示します。
+ 存在しない場合、検索が失敗したことを示す以下の QMessageBox が表示されます。
+
+ \image addressbook-tutorial-part5-notfound.png
+*/
+
+/*!
+ \page tutorials-addressbook-part6.html
+
+ \example tutorials/addressbook/part6
+ \title 第6章 - 読み込みと保存
+
+ 本章では、アドレス帳アプリケーションの読み込みと保存処理で使用する、
+ Qt のファイル処理機能について説明します。
+
+ \image addressbook-tutorial-part6-screenshot.png
+
+ 連絡先の参照及び検索機能は便利な機能ですが、
+ 連絡先の保存と読み込みが可能になるまではアドレス帳は完成しません。
+
+ Qt は \l{Input/Output and Networking}{入出力}
+ 用のクラスを様々提供していますが、
+ 今回は簡単に組み合わせて使用できる QFile と QDataStream の2つのクラスを選択しました。
+
+ QFile のオブジェクトは、
+ 読み込みと書き込みが可能なディスク上のファイルを表します。
+ QFile は、さまざまなデバイスを表すより一般的な QIODevice クラスの派生クラスです。
+
+ QDataStream オブジェクトは、バイナリデータを QIODevice に保存して、
+ 後でもう一度取得できるようシリアライズするために使用します。
+ パラメータとしてそれぞれのデバイスを使用すると、
+ ストリームを開くのと同じくらい簡単に、 QIODevice
+ からの読み込みと書き込みを行うことができます。
+
+ \section1 AddressBook クラスの宣言
+
+ 2つの QPushButton オブジェクトの \c loadButton と \c saveButton
+ に加えて、2つの public slot の \c saveToFile() と \c loadFromFile()
+ を宣言します。
+
+ \snippet tutorials/addressbook/part6/addressbook.h save and load functions declaration
+ \dots
+ \snippet tutorials/addressbook/part6/addressbook.h save and load buttons declaration
+
+ \section1 AddressBook クラスの実装
+
+ コンストラクタで、 \c loadButton と \c saveButton のインスタンスを生成します。
+ 理想的には、プッシュボタンのラベルを、
+ "Load contacts from a file"(「ファイルから連絡先を読み込む」)及び、
+ "Save contacts to a file"(「連絡先をファイルに保存する」)
+ に設定するほうがよりユーザーフレンドリーです。
+ ただし、他のプッシュボタンのサイズを考慮して、
+ \gui{Load...}及び\gui{Save...}に設定します。
+ Qt は、 \l{QWidget::setToolTip()}{setToolTip()} を使用して
+ ツールチップを簡単に設定する方法を提供していますので、
+ 以下のコードでプッシュボタンにツールチップを設定します:
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp tooltip 1
+ \dots
+ \snippet tutorials/addressbook/part6/addressbook.cpp tooltip 2
+
+ ここには記載していませんが、
+ これまで実装した他の機能のように右側のレイアウトパネル
+ \c button1Layout にプッシュボタンを追加し、
+ プッシュボタンの \l{QPushButton::clicked()}{clicked()}
+ シグナルをそれぞれのスロットに接続します。
+
+ 保存機能の場合、最初に QFileDialog::getSaveFileName() を使用して、
+ \c fileName を取得します。
+ これは、QFileDialog により提供される簡易関数で、
+ モーダルなファイルダイアログをポップアップ表示させ、
+ ユーザはファイル名を入力したり、既存の \c{.abk} ファイルを選択することが出来ます。
+ \c{.abk} ファイルは、
+ 連絡先を保存したときに作成されるアドレス帳の拡張子です。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part1
+
+ 以下のスクリーンショットのようなネイティブのファイルダイアログが表示されます:
+
+ \image addressbook-tutorial-part6-save.png
+
+ \c fileName が空ではない場合、 \c fileName を用いて
+ QFile のオブジェクト \c file を作成します。
+ QFile は QIODevice の派生クラスであるため、
+ QDataStream から使用できます。
+
+ 次に、ファイルを \l{QIODevice::}{WriteOnly} モードでオープンします。
+ オープンに失敗した場合、 QMessageBox を表示してユーザに知らせます。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part2
+
+ オープンに成功した場合、 QDataStream のインスタンス \c out を生成して、
+ 開いているファイルに書き込みます。
+ QDataStream では、同じバージョンのストリームを使用して、
+ 読み込みと書き込みを行う必要があります。
+ \c file にシリアライズする前に、
+ \l{QDataStream::Qt_4_5}{Qt 4.5で導入されたバージョン}
+ を今回使用するバージョンとして設定します。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part3
+
+ 読み込み機能の場合も QFileDialog::getOpenFileName() を使用して
+ \c fileName を取得します。
+ この関数は QFileDialog::getSaveFileName() に対応するものであり、
+ モーダルなファイルダイアログをポップアップ表示させ、
+ ユーザはファイル名を入力したり、既存の \c{.abk}
+ ファイルを選択してアドレス帳に読み込ことができます。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part1
+
+ たとえば、 Windows では、この関数は、以下のスクリーンショットのような
+ ネイティブのファイルダイアログをポップアップ表示させます。
+
+ \image addressbook-tutorial-part6-load.png
+
+ \c fileName が空ではない場合、 QFile のオブジェクト
+ \c file を使用して、 \l{QIODevice::}{ReadOnly} モードでオープンします。
+ \c saveToFile() の実装の場合と同様に、オープンに失敗した場合は
+ QMessageBox を表示して、ユーザに知らせます。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part2
+
+ オープンに成功した場合、
+ QDataStream のインスタンス \c in を生成して前記のようにバージョン設定を行い、
+ シリアライズしたデータを \c contacts のデータ構造に読み込みます。
+ \c contacts オブジェクトはデータが読み込まれる前に空にするので、
+ ファイルの読み込みプロセスは簡素化されます。
+ より高度な方法では、一時オブジェクトの QMap に読み込んで、
+ 重複していない連絡先を \c contacts にコピーします。
+
+ \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part3
+
+ ファイルから読み込んだ連絡先を表示するには、
+ 最初に取得したデータを検証し、
+ 読み込んだファイルにアドレス帳の連絡先が実際に含まれているか確認します。
+ 含まれている場合、最初の連絡先を表示します。
+ 含まれていない場合、QMessageBox を表示して、
+ 問題があることをユーザに知らせます。
+ 最後にインターフェースを更新し、適宜
+ プッシュボタンの有効化と無効化を行います。
+*/
+
+/*!
+ \page tutorials-addressbook-part7.html
+
+ \example tutorials/addressbook/part7
+ \title 第7章 - 追加機能
+
+ 本章では、アドレス帳アプリケーションを
+ 普段の生活で便利に使用するための追加機能について説明します。
+
+ \image addressbook-tutorial-part7-screenshot.png
+
+ アドレス帳アプリケーションは、それ自体で便利ですが、
+ 他のアプリケーションとデータの交換ができればなお便利です。
+ vCard 形式は、この目的で使用可能な一般的なファイル形式です。
+ 本章では、連絡先を vCard ファイル(\c{.vcf})
+ にエクスポートできるよう、アドレス帳クライアントを拡張します。
+
+ \section1 AddressBook クラスの宣言
+
+ QPushButton のオブジェクト \c exportButton 及び、
+ 対応する public slot の \c exportAsVCard() を
+ \c addressbook.h ファイルの \c AddressBook クラスに追加します。
+
+ \snippet tutorials/addressbook/part7/addressbook.h exportAsVCard() declaration
+ \dots
+ \snippet tutorials/addressbook/part7/addressbook.h exportButton declaration
+
+ \section1 AddressBook クラスの実装
+
+ \c AddressBook のコンストラクタで、 \c exportButton の
+ \l{QPushButton::clicked()}{clicked()} シグナルを
+ \c exportAsVCard() に接続します。
+ このボタンも、右側のボタンのパネルの処理を行うレイアウトである
+ \c buttonLayout1 に追加します。
+
+ \c exportAsVCard() 関数では、
+ 連絡先の名前を \c name に抽出することから始めます。
+ \c firstName 、 \c lastName 及び \c nameList を宣言します。
+ 次に \c name を検索し、最初の空白のインデックスを取得します。
+ 空白が存在する場合、連絡先の名前を \c firstName と
+ \c lastName に分割します。
+ 次に、空白をアンダースコア ("_") に置き換えます。
+ 空白が存在しない場合は、連絡先にファーストネーム(名)
+ しか保存されていない可能性があります。
+
+ \snippet tutorials/addressbook/part7/addressbook.cpp export function part1
+
+ \c saveToFile() 関数と同様に、ユーザがファイルの場所を選択できるよう
+ ファイルダイアログを開きます。
+ 選択したファイル名を使用して、
+ 書き込みを行うための QFile のインスタンスを生成します。
+
+ ファイルを \l{QIODevice::}{WriteOnly} モードでオープンします。
+ オープンに失敗した場合、 QMessageBox を表示して、
+ 問題があることをユーザに知らせて戻ります。
+ オープンに成功した場合、 QTextStream のオブジェクト \c out へ
+ パラメータファイルを渡します。
+ QDataStream のように、QTextStream クラスは、
+ プレーンテキストファイルの読み込みと書き込みを行う機能を提供します。
+ 結果として、生成された \c{.vcf} は
+ テキストエディターで開いて編集することができます。
+
+ \snippet tutorials/addressbook/part7/addressbook.cpp export function part2
+
+ まず \c{BEGIN:VCARD} タグ、次に \c{VERSION:2.1} タグの順に
+ vCard ファイルに書き込みます。
+ 連絡先の名前は、 \c{N:} タグを使用して書き込みます。
+ vCard の "File as" プロパティを設定する \c{FN:} タグを書き込む際は、
+ 連絡先にラストネーム(姓)が含まれているかどうかを確認する必要があります。
+ 含まれている場合、 \c nameList の情報を使用して入力します。
+ 含まれていない場合、 \c firstName のみを書き込みます。
+
+ \snippet tutorials/addressbook/part7/addressbook.cpp export function part3
+
+ 続けて連絡先の住所の書き込みを行います。
+ 住所のセミコロンには、"\\" をエスケープ文字として追加する必要があります。
+ 改行はセミコロンに置き換えられ、コンマはスペースに置き換えられます。
+ 次に、 \c{ADR;HOME:;} タグ、 \c address 、
+ \c{END:VCARD} タグの順に書き込みます。
+
+ \snippet tutorials/addressbook/part7/addressbook.cpp export function part4
+
+ 最後に、vCard のエクスポートに成功したことをユーザに知らせるために、
+ QMessageBox が表示されます。
+
+ \e{vCard は、\l{http://www.imc.org}{Internet Mail Consortium} の登録商標です。}
+*/
diff --git a/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc b/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc
new file mode 100644
index 0000000..6a6b1a2
--- /dev/null
+++ b/doc/src/ja_JP/tutorials/widgets-tutorial.qdoc
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page widgets-tutorial.html
+ \title ウィジェットのチュートリアル
+ \brief 本チュートリアルではウィジェットとレイアウトの基本的な使い方を説明し、それらが GUI アプリケーションの開発でどのように使われるかを説明します。
+
+ \section1 はじめに
+
+ ウィジェットは Qt によるグラフィカルユーザインターフェース(GUI)アプリケーションの基本構成要素です。
+ ボタン、ラベル、テキストエディターなどの各 GUI コンポーネントはウィジェットであり、
+ 既存のウィンドウのユーザーインタフェース内に配置したり、独立したウィンドウとして表示することができます。
+ それぞれのコンポーネントは QWidget の派生クラスとして実装されます。
+ QWidget 自体は QObject の派生クラスです。
+
+ QWidget は抽象クラスではなく、
+ 他のウィジェット用のコンテナとして使用されたり、
+ カスタムウィジェットを作る場合の基底クラスとして使用されます。
+ 他のウィジェットを配置するウィンドウとしてもよく使われます。
+
+ \l{QObject} と同様に QWidget は所有権を示すために親オブジェクトを指定して生成できるため、
+ 親オブジェクトが使用されなくなった場合には破棄されます。
+ ウィジェットではこの親子関係が他の意味も持ちます。
+ 子ウィジェットは親ウィジェットが使用する領域内に表示されます。
+ これは、ウィンドウを削除するとそのウィンドウに含まれる全てのウィジェットが自動的に破棄されることを意味します。
+
+ \section1 main 関数の記述
+
+ Qt の GUI サンプルの多くは標準的なアプリケーションの初期化コードを含む
+ \c{main.cpp} ファイルと、アプリケーションのロジックやカスタム
+ GUI コンポーネントを含むいくつかのソース/ヘッダファイルから構成されています。
+
+ \c{main.cpp} 内の典型的な \c main() 関数は以下のようになります:
+
+ \snippet doc/src/snippets/widgets-tutorial/template.cpp main.cpp body
+
+ 最初に、コマンドラインから渡される引数を渡して QApplication のオブジェクトを生成します。
+ ウィジェットを生成して表示した後、 QApplication::exec() を呼び出して Qt のイベントループを開始します。
+ この関数から戻ってくるまでアプリケーションの制御は Qt 側にて行われます。最後に、\c{main()} は QApplication::exec() から取得された値を返します。
+
+ \section1 簡単なウィジェットのサンプル
+
+ 以下の簡単なウィジェットのサンプルでは \c main() 関数の中にコードを記述しています。
+
+ \list
+ \o \l {tutorials/widgets/toplevel}{ウィンドウの作成}
+
+ \o \l {tutorials/widgets/childwidget}{子ウィジェット}
+
+ \o \l {tutorials/widgets/windowlayout}{レイアウトの利用}
+
+ \o \l {tutorials/widgets/nestedlayouts}{複雑なレイアウト}
+ \endlist
+
+ \section1 複雑なウィジェットのサンプル
+
+ \l{Widgets examples}{より高度なサンプル} の場合、ウィジェットやレイアウトのためのコードは他のファイルに記述されています。
+ 例えば、メインウインドウ用の GUI は、 QMainWindow 派生クラスのコンストラクタで作成されるでしょう。
+
+ \section1 サンプルのビルド
+
+ Qt のバイナリパッケージを取得してインストールするか、Qt を自分でコンパイルした場合には既にこのチュートリアルで説明されているサンプルはビルドされ、実行する準備ができています。
+ これらを変更し再コンパイルをしたい場合は、次の手順に従う必要があります:
+
+ \list 1
+ \o コマンドラインで、再コンパイルしたいサンプルを含むディレクトリに移動します。
+ \o \c qmake と入力し、\key{Return} キーを押します。
+ うまくいかない場合は、現在のパス内にこの実行ファイルが存在することを確認するか、
+ フルパスを指定して実行してください。
+ \o Linux/Unix および Mac OS X の場合、\c make と入力し、\key{Return} キーを押します。
+ Windows 上の Visual Studio の場合、\c nmake と入力し、\key{Return} キーを押します。
+ \endlist
+
+ 現在のディレクトリに実行ファイルが生成されます。
+ Windows では、このファイルは \c debug または \c release
+ ディレクトリに配置されているかもしれません。
+ このファイルを実行すると、作業中のサンプルコードの動作を確認できます。
+*/
+
+/*!
+ \example tutorials/widgets/toplevel
+ \title ウィジェットのチュートリアル - ウィンドウの作成
+
+ 親を持たないウィジェットを作成した場合、そのウィジェットは表示時にウィンドウ(\e{トップレベルウィジェット})として扱われます。
+ このウィジェットが必要なくなった場合にそれを破棄してくれる親ウィジェットがないため、トップレベルウィジェットの管理は開発者が行ってください。
+
+ 以下のサンプルでは QWidget を使用してウィンドウを作成し、サイズを指定して表示します:
+
+ \raw HTML
+ <table align="left" width="100%">
+ <tr class="qt-code"><td>
+ \endraw
+ \snippet tutorials/widgets/toplevel/main.cpp main program
+ \raw HTML
+ </td><td align="right">
+ \endraw
+ \inlineimage widgets-tutorial-toplevel.png
+ \raw HTML
+ </td></tr>
+ </table>
+ \endraw
+
+ 実際の GUI を作成するには、ウィンドウ内にウィジェットを配置する必要があります。
+ これは、ウィジェットのコンストラクタに QWidget のインスタンスを渡すことで実現します。
+ 詳細は本チュートリアルの次の章で示します。
+*/
+
+/*!
+ \example tutorials/widgets/childwidget
+ \title ウィジェットのチュートリアル - 子ウィジェット
+
+ 前のサンプルで作成したウィンドウに子ウィジェットを追加するために、
+ 親として \c window を子ウィジェットのコンストラクタに渡します。
+ ここでは、ウィンドウにボタンを追加し特定の場所に配置します:
+
+ \raw HTML
+ <table align="left" width="100%">
+ <tr class="qt-code"><td>
+ \endraw
+ \snippet tutorials/widgets/childwidget/main.cpp main program
+ \raw HTML
+ </td><td align="right">
+ \endraw
+ \inlineimage widgets-tutorial-childwidget.png
+ \raw HTML
+ </td></tr>
+ </table>
+ \endraw
+
+ このボタンはウィンドウの子になり、
+ ウィンドウが破棄された場合にはボタンも破棄されるでしょう。
+ ウィンドウを非表示化したり閉じた際には、自動的に破棄はされません。
+ サンプルが終了する場合には破棄されるでしょう。
+*/
+
+/*!
+ \example tutorials/widgets/windowlayout
+ \title ウィジェットのチュートリアル - レイアウトの利用
+
+ 一般的に子ウィジェットは、位置とサイズを明確に指定するのではなく、
+ レイアウトオブジェクトを使用してウィンドウ内に配置します。
+ ここでは、ラベルとラインエディットを生成し、横に並べて配置します。
+
+ \raw HTML
+ <table align="left" width="100%">
+ <tr class="qt-code"><td>
+ \endraw
+ \snippet tutorials/widgets/windowlayout/main.cpp main program
+ \raw HTML
+ </td><td align="right">
+ \endraw
+ \inlineimage widgets-tutorial-windowlayout.png
+ \raw HTML
+ </td></tr>
+ </table>
+ \endraw
+
+ 生成する \c layout オブジェクトは、 \l{QHBoxLayout::}{addWidget()} 関数を使って設定されたウィジェットの位置とサイズを管理します。
+ また、\l{QWidget::}{setLayout()} を使用してレイアウトをウィンドウに設定します。
+ レイアウトはそれ自体は目には見えない存在です。
+ レイアウトの管理対象となっているウィジェット(や他のレイアウト)に対しての効果としてのみ、その存在を確認できます。
+
+ 上記サンプルにおいて、各ウィジェットの所有権はあまり明確ではありません。
+ 親オブジェクトのない3つのウィジェットと1つのレイアウトを作成するため、
+ 空のウィンドウと、ラベルとラインエディットをそれぞれ含む別々のウィンドウが表示されるように見えるかもしれません。
+ しかし、レイアウトにラベルとラインエディットを管理するように指定すると、
+ ウィンドウにそのレイアウトを設定した際に「親の再指定」が行われるため、
+ ウィジェットおよびレイアウト自体がそのウィンドウの子になります。
+*/
+
+/*!
+ \example tutorials/widgets/nestedlayouts
+ \title ウィジェットのチュートリアル - 複雑なレイアウト
+
+ ウィジェットの中に他のウィジェットを含めることができるように、
+ レイアウトは異なるレベルでのウィジェットのグループ化にも使用されます。
+ ここではウィンドウ上部にラベルとラインエディットを隣り合わせに配置し、
+ その下に検索結果が表示されるテーブルビューを表示します。
+
+ これは、レイアウトを2つ作成して行います。\c{queryLayout} は、QLabel と QLineEdit を左右に並べて表示する QHBoxLayout です。
+ \c{mainLayout} は、\c{queryLayout} と QTableView を上下に並べて表示する QVBoxLayout です。
+
+ \raw HTML
+ <table align="left" width="100%">
+ <tr class="qt-code"><td>
+ \endraw
+ \snippet tutorials/widgets/nestedlayouts/main.cpp first part
+ \snippet tutorials/widgets/nestedlayouts/main.cpp last part
+ \raw HTML
+ </td><td align="right">
+ \endraw
+ \inlineimage widgets-tutorial-nestedlayouts.png
+ \raw HTML
+ </td></tr>
+ </table>
+ \endraw
+
+ \c{mainLayout} の \l{QBoxLayout::}{addLayout()} 関数にて追加された
+ \c{queryLayout} と \c{resultView} は追加された順番で上から並べられます。
+
+ ここでは QTableView ウィジェット \c resultView に表示されるデータを含むモデルの設定のコードは省略していますが、
+ 後ほど示します。
+
+ QHBoxLayout や QVBoxLayout と共に Qt から提供される QGridLayout および QFormLayout を使用することにより、
+ より複雑なユーザインターフェースの構築が可能になります。
+ これらのレイアウトの効果は、\l{Qt Designer} を実行して確認できます。
+
+ \section1 モデルを設定する
+
+ 上記のコードでは、レイアウトの有効利用に重点を置いていたため、
+ テーブルのデータについては示していませんでした。
+ 以下のコードで、モデルには行に対応する項目が含まれ、それぞれの行には2つの列のデータが設定されていることがわかるでしょう。
+
+ \snippet tutorials/widgets/nestedlayouts/main.cpp set up the model
+
+ モデルとビューの有効利用については、\l{Item Views Examples} および
+ \l{Model/View Programming} の概要に含まれています。
+*/
diff --git a/examples/activeqt/activeqt.pro b/examples/activeqt/activeqt.pro
index 262e1a1..79d257a 100644
--- a/examples/activeqt/activeqt.pro
+++ b/examples/activeqt/activeqt.pro
@@ -11,7 +11,7 @@ contains(QT_CONFIG, opengl):SUBDIRS += opengl
# For now only the contain examples with mingw, for the others you need
# an IDL compiler
-win32-g++|wince*:SUBDIRS = webbrowser
+win32-g++*|wince*:SUBDIRS = webbrowser
# install
target.path = $$[QT_INSTALL_EXAMPLES]/activeqt
diff --git a/examples/ja_JP/linguist/hellotr/hellotr.pro b/examples/ja_JP/linguist/hellotr/hellotr.pro
new file mode 100644
index 0000000..3846bfb
--- /dev/null
+++ b/examples/ja_JP/linguist/hellotr/hellotr.pro
@@ -0,0 +1,13 @@
+#! [0]
+SOURCES = main.cpp
+#! [0] #! [1]
+TRANSLATIONS = hellotr_ja.ts
+#! [1]
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/linguist/hellotr
+sources.files = $$SOURCES *.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/linguist/hellotr
+INSTALLS += target sources
+
+symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
diff --git a/examples/ja_JP/linguist/hellotr/main.cpp b/examples/ja_JP/linguist/hellotr/main.cpp
new file mode 100644
index 0000000..ad122e9
--- /dev/null
+++ b/examples/ja_JP/linguist/hellotr/main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include <QPushButton>
+//! [0]
+#include <QTranslator>
+//! [0]
+
+//! [1] //! [2]
+int main(int argc, char *argv[])
+//! [1] //! [3] //! [4]
+{
+ QApplication app(argc, argv);
+//! [3]
+
+//! [5]
+ QTranslator translator;
+//! [5] //! [6]
+ translator.load("hellotr_ja");
+//! [6] //! [7]
+ app.installTranslator(&translator);
+//! [4] //! [7]
+
+//! [8]
+ QPushButton hello(QPushButton::tr("Hello world!"));
+//! [8]
+ hello.resize(100, 30);
+
+ hello.show();
+ return app.exec();
+}
+//! [2]
diff --git a/examples/tutorials/addressbook/part3/addressbook.cpp b/examples/tutorials/addressbook/part3/addressbook.cpp
index adb87ef..28a570a 100644
--- a/examples/tutorials/addressbook/part3/addressbook.cpp
+++ b/examples/tutorials/addressbook/part3/addressbook.cpp
@@ -125,6 +125,7 @@ void AddressBook::submitContact()
if (name == "" || address == "") {
QMessageBox::information(this, tr("Empty Field"),
tr("Please enter a name and address."));
+ return;
}
if (!contacts.contains(name)) {
diff --git a/examples/tutorials/addressbook/part4/addressbook.cpp b/examples/tutorials/addressbook/part4/addressbook.cpp
index 1b7a6c4..55d551f 100644
--- a/examples/tutorials/addressbook/part4/addressbook.cpp
+++ b/examples/tutorials/addressbook/part4/addressbook.cpp
@@ -134,6 +134,7 @@ void AddressBook::submitContact()
if (name == "" || address == "") {
QMessageBox::information(this, tr("Empty Field"),
tr("Please enter a name and address."));
+ return;
}
//! [submitContact() function part1]
if (currentMode == AddingMode) {
diff --git a/examples/tutorials/addressbook/part5/addressbook.cpp b/examples/tutorials/addressbook/part5/addressbook.cpp
index 80c18c3..1b3f451 100644
--- a/examples/tutorials/addressbook/part5/addressbook.cpp
+++ b/examples/tutorials/addressbook/part5/addressbook.cpp
@@ -141,6 +141,7 @@ void AddressBook::submitContact()
if (name == "" || address == "") {
QMessageBox::information(this, tr("Empty Field"),
tr("Please enter a name and address."));
+ return;
}
if (currentMode == AddingMode) {
diff --git a/examples/tutorials/addressbook/part6/addressbook.cpp b/examples/tutorials/addressbook/part6/addressbook.cpp
index fc41190..724971c 100644
--- a/examples/tutorials/addressbook/part6/addressbook.cpp
+++ b/examples/tutorials/addressbook/part6/addressbook.cpp
@@ -147,6 +147,7 @@ void AddressBook::submitContact()
if (name == "" || address == "") {
QMessageBox::information(this, tr("Empty Field"),
tr("Please enter a name and address."));
+ return;
}
if (currentMode == AddingMode) {
diff --git a/examples/tutorials/addressbook/part7/addressbook.cpp b/examples/tutorials/addressbook/part7/addressbook.cpp
index 3ab8702..bf00298 100644
--- a/examples/tutorials/addressbook/part7/addressbook.cpp
+++ b/examples/tutorials/addressbook/part7/addressbook.cpp
@@ -149,6 +149,7 @@ void AddressBook::submitContact()
if (name == "" || address == "") {
QMessageBox::information(this, tr("Empty Field"),
tr("Please enter a name and address."));
+ return;
}
if (currentMode == AddingMode) {
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 3353180..3b26f7d 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -21,13 +21,13 @@ QMAKE_LEX = flex
QMAKE_LEXFLAGS =
QMAKE_YACC = yacc
QMAKE_YACCFLAGS = -d
-QMAKE_CFLAGS = -wd654,1572
+QMAKE_CFLAGS =
QMAKE_CFLAGS_DEPS = -M
-QMAKE_CFLAGS_WARN_ON =
+QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125
QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE = -O2
-QMAKE_CFLAGS_DEBUG = -g
-QMAKE_CFLAGS_SHLIB = -fPIC
+QMAKE_CFLAGS_RELEASE = -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing
+QMAKE_CFLAGS_DEBUG = -O0 -g
+QMAKE_CFLAGS_SHLIB = -fPIC -fno-jump-tables
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
QMAKE_CFLAGS_YACC =
QMAKE_CFLAGS_THREAD = -D_REENTRANT
@@ -58,11 +58,12 @@ QMAKE_LINK_SHLIB = icpc
QMAKE_LFLAGS =
QMAKE_LFLAGS_RELEASE =
QMAKE_LFLAGS_DEBUG =
-QMAKE_LFLAGS_SHLIB = -shared
+QMAKE_LFLAGS_SHLIB = -shared -shared-intel
QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME = -Qoption,ld,-soname,
+QMAKE_LFLAGS_SONAME = -Wl,-soname,
QMAKE_LFLAGS_THREAD =
-QMAKE_LFLAGS_RPATH = -Qoption,ld,-rpath,
+QMAKE_LFLAGS_NOUNDEF = -Wl,-z,defs
+QMAKE_LFLAGS_RPATH = -Wl,-rpath,
QMAKE_LIBS =
QMAKE_LIBS_DYNLOAD = -ldl
@@ -76,7 +77,7 @@ QMAKE_LIBS_THREAD = -lpthread
QMAKE_MOC = $$[QT_INSTALL_BINS]/moc
QMAKE_UIC = $$[QT_INSTALL_BINS]/uic
-QMAKE_AR = ar cqs
+QMAKE_AR = xiar cqs
QMAKE_OBJCOPY = objcopy
QMAKE_RANLIB =
@@ -99,8 +100,8 @@ QMAKE_CXXFLAGS_USE_PRECOMPILE = -pch-use ${QMAKE_PCH_OUTPUT} -include ${QMAKE_PC
QMAKE_CXXFLAGS_PRECOMPILE = -c -pch-create ${QMAKE_PCH_OUTPUT} -include ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_TEMP_OBJECT} ${QMAKE_PCH_TEMP_SOURCE}
# -Bsymbolic-functions (ld) support
-QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Qoption,ld,-Bsymbolic-functions
-QMAKE_LFLAGS_DYNAMIC_LIST = -Qoption,ld,--dynamic-list,
+QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions
+QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,
# Symbol visibility control
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
diff --git a/mkspecs/unsupported/win32-g++-cross/qmake.conf b/mkspecs/unsupported/win32-g++-cross/qmake.conf
new file mode 100644
index 0000000..e338a22
--- /dev/null
+++ b/mkspecs/unsupported/win32-g++-cross/qmake.conf
@@ -0,0 +1,101 @@
+#
+# qmake configuration for win32-g++-cross
+#
+# Written for MinGW cross building on Unix
+#
+
+MAKEFILE_GENERATOR = MINGW
+TEMPLATE = app
+CONFIG += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header
+QT += core gui
+DEFINES += UNICODE QT_LARGEFILE_SUPPORT
+QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
+
+QMAKE_EXT_OBJ = .o
+QMAKE_EXT_RES = _res.o
+
+QMAKE_CC = i686-pc-mingw32-gcc
+QMAKE_LEX = flex
+QMAKE_LEXFLAGS =
+QMAKE_YACC = byacc
+QMAKE_YACCFLAGS = -d
+QMAKE_CFLAGS = -pipe
+QMAKE_CFLAGS_DEPS = -M
+QMAKE_CFLAGS_WARN_ON = -Wall
+QMAKE_CFLAGS_WARN_OFF = -w
+QMAKE_CFLAGS_RELEASE = -O2
+QMAKE_CFLAGS_DEBUG = -g
+QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+QMAKE_CXX = i686-pc-mingw32-g++
+QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
+QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
+QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
+QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
+QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
+QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
+QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
+QMAKE_CXXFLAGS_RTTI_ON = -frtti
+QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
+QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
+QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
+
+QMAKE_INCDIR =
+QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
+QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
+
+QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
+QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
+QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+QMAKE_LINK = i686-pc-mingw32-g++
+QMAKE_LINK_C = i686-pc-mingw32-gcc
+QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
+QMAKE_LFLAGS_EXCEPTIONS_OFF =
+QMAKE_LFLAGS_RELEASE = -Wl,-s
+QMAKE_LFLAGS_DEBUG =
+QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
+QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
+QMAKE_LFLAGS_DLL = -shared
+QMAKE_LINK_OBJECT_MAX = 10
+QMAKE_LINK_OBJECT_SCRIPT= object_script
+
+
+QMAKE_LIBS =
+QMAKE_LIBS_CORE = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
+QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32
+QMAKE_LIBS_NETWORK = -lws2_32
+QMAKE_LIBS_OPENGL = -lopengl32 -lglu32 -lgdi32 -luser32
+QMAKE_LIBS_COMPAT = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
+QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain
+
+QMAKE_SH = bash
+
+MINGW_IN_SHELL = 1
+QMAKE_DIR_SEP = /
+QMAKE_COPY = cp
+QMAKE_COPY_DIR = cp -r
+QMAKE_MOVE = mv
+QMAKE_DEL_FILE = rm -f
+QMAKE_MKDIR = mkdir -p
+QMAKE_DEL_DIR = rmdir
+QMAKE_SYMBOLIC_LINK = ln -s
+QMAKE_CHK_DIR_EXISTS = test -d
+
+#QMAKE_IDC = i686-pc-mingw32-idc
+QMAKE_MOC = i686-pc-mingw32-moc
+QMAKE_RCC = i686-pc-mingw32-rcc
+QMAKE_UIC = i686-pc-mingw32-uic
+
+#QMAKE_IDL = midl
+QMAKE_LIB = i686-pc-mingw32-ar -ru
+QMAKE_RC = i686-pc-mingw32-windres
+QMAKE_ZIP = zip -r -9
+
+QMAKE_STRIP = i686-pc-mingw32-strip
+QMAKE_STRIPFLAGS_LIB += --strip-unneeded
+PKG_CONFIG = i686-pc-mingw32-pkg-config
+load(qt_config)
diff --git a/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h b/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h
new file mode 100644
index 0000000..309e24a
--- /dev/null
+++ b/mkspecs/unsupported/win32-g++-cross/qplatformdefs.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../win32-g++/qplatformdefs.h"
diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp
index ad8750b..e98831d 100644
--- a/qmake/generators/metamakefile.cpp
+++ b/qmake/generators/metamakefile.cpp
@@ -529,9 +529,18 @@ MetaMakefileGenerator::modesForGenerator(const QString &gen,
*host_mode = Option::HOST_UNIX_MODE;
*target_mode = Option::TARG_UNIX_MODE;
#endif
- } else if (gen == "MSVC.NET" || gen == "MINGW" || gen == "BMAKE" || gen == "MSBUILD") {
+ } else if (gen == "MSVC.NET" || gen == "BMAKE" || gen == "MSBUILD") {
*host_mode = Option::HOST_WIN_MODE;
*target_mode = Option::TARG_WIN_MODE;
+ } else if (gen == "MINGW") {
+#if defined(Q_OS_MAC)
+ *host_mode = Option::HOST_MACX_MODE;
+#elif defined(Q_OS_UNIX)
+ *host_mode = Option::HOST_UNIX_MODE;
+#else
+ *host_mode = Option::HOST_WIN_MODE;
+#endif
+ *target_mode = Option::TARG_WIN_MODE;
} else if (gen == "PROJECTBUILDER" || gen == "XCODE") {
*host_mode = Option::HOST_MACX_MODE;
*target_mode = Option::TARG_MACX_MODE;
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
index 0936d15..5685d6b 100644
--- a/qmake/generators/win32/mingw_make.cpp
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -371,7 +371,12 @@ void MingwMakefileGenerator::writeObjectsPart(QTextStream &t)
ar_script_file += "." + var("BUILD_NAME");
}
createArObjectScriptFile(ar_script_file, var("DEST_TARGET"), project->values("OBJECTS"));
- objectsLinkLine = "ar -M < " + ar_script_file;
+ // QMAKE_LIB is used for win32, including mingw, whereas QMAKE_AR is used on Unix.
+ // Strip off any options since the ar commands will be read from file.
+ QString ar_cmd = var("QMAKE_LIB").section(" ", 0, 0);;
+ if (ar_cmd.isEmpty())
+ ar_cmd = "ar";
+ objectsLinkLine = ar_cmd + " -M < " + ar_script_file;
} else {
QString ld_script_file = var("QMAKE_LINK_OBJECT_SCRIPT") + "." + var("TARGET");
if (!var("BUILD_NAME").isEmpty()) {
diff --git a/qmake/qmake.pri b/qmake/qmake.pri
index 6e0f8a2..a7e0ab1 100644
--- a/qmake/qmake.pri
+++ b/qmake/qmake.pri
@@ -134,7 +134,7 @@ bootstrap { #Qt code
} else:win32 {
SOURCES += qfsfileengine_win.cpp qfsfileengine_iterator_win.cpp qsettings_win.cpp
win32-msvc*:LIBS += ole32.lib advapi32.lib
- win32-g++:LIBS += -lole32 -luuid
+ win32-g++*:LIBS += -lole32 -luuid
}
qnx {
diff --git a/src/3rdparty/javascriptcore/WebKit.pri b/src/3rdparty/javascriptcore/WebKit.pri
index 0dd0799..9aaaa99 100644
--- a/src/3rdparty/javascriptcore/WebKit.pri
+++ b/src/3rdparty/javascriptcore/WebKit.pri
@@ -36,7 +36,7 @@ building-libs {
win32-*|wince* {
CONFIG(debug, debug|release):build_pass: QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}d
QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}$${QT_MAJOR_VERSION}
- win32-g++: LIBS += -l$$QTWEBKITLIBNAME
+ win32-g++*: LIBS += -l$$QTWEBKITLIBNAME
else: LIBS += $${QTWEBKITLIBNAME}.lib
} else {
LIBS += -lQtWebKit
diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
index 22fcc91..3f1ac86 100644
--- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
+++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
@@ -43,7 +43,7 @@ CONFIG(QTDIR_build) {
}
# Pick up 3rdparty libraries from INCLUDE/LIB just like with MSVC
-win32-g++ {
+win32-g++* {
TMPPATH = $$quote($$(INCLUDE))
QMAKE_INCDIR_POST += $$split(TMPPATH,";")
TMPPATH = $$quote($$(LIB))
diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro
index 048fc93..92082b5 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.pro
+++ b/src/3rdparty/webkit/WebCore/WebCore.pro
@@ -103,7 +103,7 @@ win32-msvc2005|win32-msvc2008:{
}
# Pick up 3rdparty libraries from INCLUDE/LIB just like with MSVC
-win32-g++ {
+win32-g++* {
TMPPATH = $$quote($$(INCLUDE))
QMAKE_INCDIR_POST += $$split(TMPPATH,";")
TMPPATH = $$quote($$(LIB))
@@ -2935,7 +2935,7 @@ CONFIG(QTDIR_build) {
CONFIG += no_debug_info
}
-!win32-g++:win32:contains(QMAKE_HOST.arch, x86_64):{
+win32:!win32-g++*:contains(QMAKE_HOST.arch, x86_64):{
asm_compiler.commands = ml64 /c
asm_compiler.commands += /Fo ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
asm_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
diff --git a/src/3rdparty/webkit/WebKit.pri b/src/3rdparty/webkit/WebKit.pri
index 921a6e0..fcd2891 100644
--- a/src/3rdparty/webkit/WebKit.pri
+++ b/src/3rdparty/webkit/WebKit.pri
@@ -24,7 +24,7 @@ building-libs {
win32-*|wince* {
!CONFIG(release, debug|release):build_pass: QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}d
QTWEBKITLIBNAME = $${QTWEBKITLIBNAME}$${QT_MAJOR_VERSION}
- win32-g++: LIBS += -l$$QTWEBKITLIBNAME
+ win32-g++*: LIBS += -l$$QTWEBKITLIBNAME
else: LIBS += $${QTWEBKITLIBNAME}.lib
} else {
LIBS += -lQtWebKit
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro b/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro
index 22d4c8d..62546f6 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro
+++ b/src/3rdparty/webkit/WebKit/qt/Api/DerivedSources.pro
@@ -12,7 +12,7 @@ DOUBLE_ESCAPED_QUOTE = ""
ESCAPE = ""
win32-msvc*|symbian {
ESCAPE = "^"
-} else:win32-g++:isEmpty(QMAKE_SH) {
+} else:win32-g++*:isEmpty(QMAKE_SH) {
# MinGW's make will run makefile commands using sh, even if make
# was run from the Windows shell, if it finds sh in the path.
ESCAPE = "^"
diff --git a/src/activeqt/container/container.pro b/src/activeqt/container/container.pro
index d654f92..4c9b3a8 100644
--- a/src/activeqt/container/container.pro
+++ b/src/activeqt/container/container.pro
@@ -19,7 +19,7 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/lib
LIBS += -lole32 -loleaut32
!wince*:LIBS += -luser32 -lgdi32 -ladvapi32
-win32-g++:LIBS += -luuid
+win32-g++*:LIBS += -luuid
HEADERS = ../control/qaxaggregated.h \
qaxbase.h \
diff --git a/src/activeqt/control/control.pro b/src/activeqt/control/control.pro
index 44eb928..361ca29 100644
--- a/src/activeqt/control/control.pro
+++ b/src/activeqt/control/control.pro
@@ -18,11 +18,11 @@ CONFIG += qt warn_off staticlib
QTDIR_build:DESTDIR = $$QT_BUILD_TREE\\lib
DEFINES += QAX_SERVER
-win32-g++:DEFINES += QT_NEEDS_QMAIN
+win32-g++*:DEFINES += QT_NEEDS_QMAIN
win32-borland:DEFINES += QT_NEEDS_QMAIN
LIBS += -luser32 -lole32 -loleaut32 -lgdi32
-win32-g++:LIBS += -luuid
+win32-g++*:LIBS += -luuid
HEADERS = qaxaggregated.h \
qaxbindable.h \
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h