Live2Dには関係ないですが、Qtのアドベントカレンダーに参加したのでこちらに記載させてもらいます。

Qtに興味のある「Live2Dとはなんぞや?」という皆様、Live2Dはキャラクターなどを立体的に動かす映像技術です( Live2D.comへ ) 。 現行シリーズのLive2D CubismはJavaで開発されており、次世代版のLive2D EuclidはC++ / Qt で開発しております。

只今、Qt 好きで、世界の度肝を抜くようなグラフィックエディタ・ゲーム用SDKなどを開発したい方を大募集中です!

さて、今回の記事ですが、Javaに慣れている方が Qtにスムースに移行することを支援するための記事となります。


  • 辞書的に使いやすくしたいので、随時更新していきます。予めご了承下さい。
  • 現時点では、主に Java7 , Qt5.3あたりを前提とした内容となります。 
  • Container # setLayout() は、Containerクラスの非staticメソッド setLayout()のことを表します。

 Java Swing C++ Qt 
時刻の取得System.currentTimeMillis()

 ミリ秒で測定した、現在時刻と協定世界時の UTC 1970 年 1 月 1 日午前 0 時との差
long 型(64bit整数) 
QDateTime::currentMSecsSinceEpoch ()

milliseconds since 1970-01-01T00:00:00
qint64 型を返す static 関数
GUI関連クラス 基底クラスの Component
子要素を含む Container 
Swingでよく使う JPanel


 
QWidget

QWidgetが、Javaでの以下の役割を果たします
・基底クラスとしてのComponent 
・子要素を含むContainer
・実用上よく使うクラスとしてのJPanel


 
ウインドウ関連 Window, Frame , JFrame , JDialog 

Swingのウインドウ周りはComponentの一種です(GUIの基底クラス Componentを継承します)
QWindow
 
QWindow は、QWidgetを継承しません。

QWidget全てが、show() を呼ばれるとウインドウを生成してその中にハマるようです。

QWindowから中身のウィジェットを取り出す方法は、・・ぱっと見で見つからず。見つかり次第追記します。
レイアウト機構 Javaでは、親JPanel に子要素(JLabel,JPanelなどComponentのサブクラスのインスタンス)を追加していきます。

レイアウト情報は、親子関係をJPanelで add するときの付加情報のように設定されます。

JPanel  parent =  new JPanel( ) ;
parent.setLayout( new BorderLayout() ) ;
JLabel  child = new JLabel("hello") ;
parent.add( child , BorderLayout.CENTER ) ;

 
 Qtでは、

QWidget* child = new QWidget( parent ) ;

のように親を指定することができます。が、通常はレイアウトにaddWidget( )して階層構造をつくります。


QVBoxLayout* parent = new QVBoxLayout() ;
QHBoxLayout* child = new QHBoxLayout() ;
QLabel* label = new QLabel("hello") ;

parent.addLayout( child ) ;
child.addWidget( label ) ;

ガーベッジコレクション (当然、Java SwingではGUI部品を明示的に開放する必要はありません)


C++を使うときは通常ポインタの寿命を完璧にコントロールする必要がありますが、QtのGUI部品については親のWidgetがdeleteされるときに子要素がdeleteされるため、外部で細部までコントロールする必要はなく、Javaと同じ感覚で気軽に扱えます。
   
ボタン JButton QPushButton 
トグルボタン
(押された状態を持つボタン) 
JToggleButton QPushButton に、setCheckable( true ) でトグルボタン化
 
ラベル JLabel QLabel 
テキスト入力(一行)JTextField QLineEdit 
テキスト入力(複数行) 
書式なし
JTextArea QPlainTextEdit 
テキスト入力(複数行)
書式あり 
JTextPane QTextEdit 
チェックボックス JCheckBox QCheckBox 
ラジオボタン JRadioButton 
ButtonGroup # add( btn ) でグループ化
QRadioButton 
QButtonGroup # addButton( btn ) でグループ化
コンボボックスJComboBoxQComboBox
リスト JList QListWidget 
QListView  

少量のデータは QListWidgetで十分。
大量のデータを扱う場合は、QListViewでMVC的に使う。
ツリー JTree QTreeWidget
QTreeView

少量のデータは QTreeWidgetで十分。
大量のデータを扱う場合は、QTreeViewでMVC的に使う。
テーブル JTable QTableWidget
QTableView

少量のデータは QTreeWidgetで十分。
大量のデータを扱う場合は、QTreeViewでMVC的に使う。
タブ ペイン JTabbedPane QTabWidget
   
メニュー JMenuBar
JMenuItem
JMenu
QMenuBar 
QMenu
アクションAction
 
QAction

Javaと同様にQMenu # addAction( ) で渡して利用可能
イベントリスナ 1 JButton btn = new JButton( "hello" )
MyListener listener = new MyListener() ;

// リスナのインスタンスを登録
btn.addActionListener( listener ) ;

-------------------
class MyListener implements ActionListener{
public void actionPerformed( ActionEvent e ){
// 処理
}
}
QPushButton* btn = new QPushButton("hello") ;
MyClass * myobj = new MyClass() ;

// SIGNAL SLOTでイベントを接続
connect( btn , SIGNAL( clicked() ) , myobj  , SLOT( myFunc() ) ) ;

-------------------
class MyClass {
void myFunc( ) ;
}
イベントリスナ2 無名内部クラス(匿名クラス)のインスタンスとして登録

btn.addActionListener( new ActionLsitener(){
public void actionPerformed( ActionEvent e ){
//処理
}
}) ; 
( 次のラムダ式が近いです )
イベントリスナ3 Java8 のラムダ (使った事ないです)

button.addActionListener( e -> /*処理*/ ) ; 
C++11 のラムダ式

connect( btn, &QPushButton::clicked , []() { /* 処理 */ } ) ;


※ &QPushButton::clicked というあまり見慣れない書式をSIGNALの代わりに使う。 clicked に ()を付けないことに注意
   
画像 Image
BufferedImage  
QImage (BufferedImageと同様に、画素の生データにアクセス可能) 
文字列String QString 
部分文字列の取得 String # substring( startpos )
 最後まで "hello".substring(1,3) >> "el"
String # substring( startpos , endpos )
  endposの前の文字まで
QString # mid( startpos ) 
  最後まで 
QString # mid( startpos , length ) 
  length 切り出す文字数

QString # midRef( ) という命令で複製を作らずに部分文字列を取得可能 
   
   
   
お勧めエディタ (私はEclipse派です)  Qt Creator はQtと一緒にインストールされ、Eclipseに近い使い勝手で扱い易いです。サンプル集の実行などを機能として持つため、まずは QtCreatorでスタートすれば良いと思われます。Eclipse用のQtプラグイン的なものもあるようですが試せていません。試し次第追記します。Visual Studio , XCodeなども使えるようです。



間違い、追加した方が良いことなど有りましたらコメント頂ければ幸いです!