Live2Dには関係ないですが、Qtのアドベントカレンダーに参加したのでこちらに記載させてもらいます。
Qtに興味のある「Live2Dとはなんぞや?」という皆様、Live2Dはキャラクターなどを立体的に動かす映像技術です( Live2D.comへ ) 。 現行シリーズのLive2D CubismはJavaで開発されており、次世代版のLive2D EuclidはC++ / Qt で開発しております。
只今、Qt 好きで、世界の度肝を抜くようなグラフィックエディタ・ゲーム用SDKなどを開発したい方を大募集中です!
さて、今回の記事ですが、Javaに慣れている方が 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 ) でグループ化 |
コンボボックス | JComboBox | QComboBox |
リスト | 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なども使えるようです。 |
間違い、追加した方が良いことなど有りましたらコメント頂ければ幸いです!