FC2ブログ

凛(kagring)のUE4/UE5とUnityとQt勉強中のゲーム制作ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用のブログです。C++ での Qt、Unity も少しあります。ゲーム制作の話題もはじめました。

| PAGE-SELECT | NEXT

≫ EDIT

C++ Qt Layout のスペースを均等割りしないようにする

Qt で QVBoxLayout などを使ってウィジェットを配置すると
そのままではウィジェットのサイズや位置が均等割りされて配置されてしまいます。

ウィンドウサイズによって勝手にサイズや位置が変わってくれるのは便利なのですが
見た目が美しくないと感じると思います(苦笑

というわけで、ウィジェットのサイズに応じてスペースを埋める方法です。


// 余分スペースを埋める
QVBoxLayout layout;
layout->addStretch();


QVBoxLayout::addWidget(); 関数と同じように上記関数をいれるだけというお手軽です。

これを使うと簡単にこんな感じにできます。
余分なスペース埋める

ちょうど右の再生オプションの補間フレームとカメラ解除のボタンの隙間に上記処理を入れてあります。
こうすることでいい感じのレイアウトを構築できるのではないでしょうか。

| Qt | 02:13 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt Widget 上でのキーボード操作

QListBox などの Widget 上で、キーボードが推された場合の処理です。
簡単に考えるとコールバック系があるのかなと思ったのですが、
どうも Widget を継承したクラスで、関数をオーバーライドしてあげる必要があるみたいです。

・EmacsライクなWidgetを作ろう on Qt
http://blog.goo.ne.jp/hiroyuki_kiitos

ここを参考にこんな感じに。

// 継承したクラスでキーを受け取り
class CListWidget : public QListWidget {
protected:
//! キーイベント
virtual void keyPressEvent( QKeyEvent *event )
{
switch( event->key() ){
case Qt::Key_Delete:
break;
default:
break;
}
}
}


こんな感じでオーバーライドしてあげることで、
そのウィジェットでキーが押されたときの処理を実行することができます。
この他にもキーが離されたときや、マウス操作関係もあるようです。

Qt 自体、Widget を継承してカスタマイズして作っていくのが基本のようですね。

| Qt | 03:18 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt スタイルシート(CSS)を使う

ウィンドウの色などをスタイルシートによって設定する方法です。
詳しい方法は下記を参考にしていただければと…(他力本願

・スタイルいじり Lv.2
http://mf-atelier.sakura.ne.jp/mf-atelier/modules/tips/program/Qt/qt_style.html

簡単なファイルの読み込みでセットする方法だとこんな感じに。

// スタイルシートを読み込んでセット
QFile file( "main.css" );
file.open( QFile::ReadOnly );
QString strStyles = QLatin1String( file.readAll() );
QApplication *application;
application->setStyleSheet( strStyles );


とりあえずこれでこんな感じにセットすることができました。
CCS

| Qt | 02:09 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt Qt5 を EXE で実行するために必要なDLL

Qt4.8.5 を動かしている場合、だいたいは
「QtCore4.dll」「QtGui4.dll」の二つがあれば動くと思います。

Qt5 になるとちょっと違うようで、以下のファイルが必要になるようです。

// 必要なファイル
icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll


結構増えましたね…。

詳しくはここに書いてあるようなのでみていただければと。

・Windows で Qt アプリケーションをデプロイする
http://daisukekobayashi.com/blog/deploying-an-qt-application-on-windows

2014/07/01 追加
配布するバイナリと同じ場所に platforms フォルダを作って
その中に qwindows.dll がないと駄目だったようです。

・Qt5で作成したプログラムの配布時
http://www11.atwiki.jp/slice/m/pages/46.html

| Qt | 22:09 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt QTreeWidget の横スクロールバー

QTreeWidget で項目を追加していくと横スクロールバーが機能しないということがありました。
調べてもあまりでてなくてなんだろうと思っていたのですが、以下の記事がヒットしました。

・Thread: resizing a QTreeWidget
http://www.qtcentre.org/threads/3846-resizing-a-QTreeWidget

これを見てみたところ、こんな感じで項目をリサイズしてあげるとよいみたいです。

// リサイズ
// 項目の数だけ実行するとよい?
treeWidget->resizeColumnToContents(0);


一応これで無事横スクロールバーが機能したのですが、
項目を追加するだけだと、Widget 全体のサイズが変わっていないので、
スクロールバーがいらないものと判断されているみたいです。
項目をリサイズすることで、Widget のサイズが変わるということみたいですね。

というわけでちょっと納得いかないですが無事解決しました(苦笑)

| Qt | 02:15 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt QListWidget の removeItemWidget を使ったアイテム削除

Qt 4.8.5 での処理ではまったのですが
QListWidget には QListWidgetItem ひとつを削除する removeItemWidget という関数があります。
スロット関数などで、選択していたりするアイテムをこれで削除だ!
とおもって呼んでも何も起きないんですよね…。

というわけで調べてみるとこんな記事が。

・QListWidgetのremoveItemWidgetが期待したとおり動かない
http://milukiriu2010.blog71.fc2.com/blog-entry-124.html

まさに自分と同じ状況でした。
これを見る限り、QListWidgetItem* を消そうとする場合、
removeItemWidget を使うのではなく、QListWidgetItem* を delete で解放するというものでした。

この通りやってみるとアイテムもリストから消えて正常に動作しているようです(苦笑)
不安はありますが正常動作しているのでいいかなぁと…。
Qt5 だと直ってるのかもしれません。

| Qt | 01:12 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt シグナルの停止

Qt のウィジェットを扱っている場合、シグナルとスロットでいろいろと連動することになると思います。
その場合、一気にデータをウィジェットにセットする場合など
シグナルが常に動作すると変な挙動をしてしまったりすると思います。
このシグナルを切る方法です。


// シグナルを止める
QWidget *widget;
widget->blockSignals(true);


こんな感じで止めることができます。
大体の場合、ウィンドウの子としてウィジェットを作っていると思うので
その場合は子に対して止めることで、そのウィンドウに関わる全てのシグナルを止めることができます。


// 子も含めすべてのシグナルを止める
QWidget *windowWidget;
QList< QWidget*> childList = windowWidget->findChildren< QWidget*>();
for( int i = 0; i < childList.count(); i++ ){
QWidget* widget = childList.at(i);
if( widget != nullptr ){
// シグナルを停止
widget->blockSignals(true);
}
}


こんな感じですね。
シグナルを有効にする場合は false を渡せば復帰します。
結構使う場面はでてくるんじゃないでしょうか。

| Qt | 01:01 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt カラーピッカー(QColorDialog)

Qt でモデルの色などを選択したかったので色々探していました。

とりあえず QColorDialog とういうものがあったので
この動画を見ながら実装してみました。



ここに書いてある

// カラー選択ダイアログ
QColor color = QClolorDialog::getColor( Qt::yellow, this );

といった書き方が一番簡単に色を取得することができます。
アルファ値も取得できるのでこれは良いですねー。

一応、上記以外の使い方をすれば、処理をとめずにリアルタイムで反映することもできます。
ここらへんは Qt の他のウィジェットと同じ使い方でできるのがよいですねー。

というわけでこんな感じに。

| Qt | 16:37 | comments:2 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt 閉じるボタンで閉じないようにする

Qt のウィンドウの右上の×ボタンで閉じなくするような処理です。

・Qtで閉じるを押しても閉じないようにしたいなとか思った
http://opamp.hatenablog.jp/entry/20120401/1333252702

このサイトを参考に…と思ったのですが、参考どころかそのままでいけました。
closeEvent を作成すればよいみたいですね。

閉じる処理を無効にして setVisible(false); とかで非表示にするとか結構使えるかも…?
あとは最小化とかでしょうか。

| Qt | 01:19 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

C++ Qt QDockWidget のドッキング無効化

Qt の QDockWidget で親ウィンドウにドッキングしないようにする方法です。

こんな感じになります。

// ウィンドウ
QtWindow::QtWindow( QWidget* parent )
: QDockWidget(parent)
{
// ドッキングを無効
this->setAllowedAreas( Qt::NoDockWidgetArea );
// 最初はDockせずにフローティングの状態にする
this->setFloating(true);
}


setAllowedAreas( Qt::NoDockWidgetArea );
これが無効化するための関数です。
setFloating(true);
この関数で初期をドッキングしないようにしておくとよいかもです。

メインウィンドウの奥にいってもらいたくないウィンドウなどを作るときになど使えるかもしれません。

| Qt | 01:09 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT