トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「Qt」に関連する記事一覧

0  1  2  

[Qt Designer] タブウィジェットの中身のサイズをタブウィジェットのサイズに追従

2018/10/24

qt designer QTabWidget

Qt Designer を久しぶりに触って何もかも忘れていました。タブウィジェットの中身のコントロールのサイズをタブウィジェットのサイズに追従させる方法がすぐにわからなかったのでメモします。

Qt QGLWidgetでアイドル状態のときにも描画処理を呼ぶ

2013/08/25 21:00
Qt 

QtでOpenNIから取得した深度データを描画させるためにQGLWidget::paintGL()に描画する処理を記述したんですが、リサイズなどのイベントが発生しないとpaintGL()はコールされないため、何もしないと描画されないという状態になってしまいました。

調べてみると毎フレーム自動的に描画させるためにはやはりeventFilter()で描画を呼ぶ処理を記述しないといけないようです。

ひとまず下記のように書いたらうまく描画されるようになりました。UPDATE_INTERVALのような決めうちな値は使っているのは、毎回描画するようにしてしまうと描画処理が呼ばれすぎるせいかGUIの更新が遅れてしまったからです。


MyWidget::MyWidget( QWidget *parent )
    : QGLWidget(parent)
{
    qApp->installEventFilter( this );
}

bool MyWidget::eventFilter(QObject *obj, QEvent *e)
{
    static int n = 0;
    const int UPDATE_INTERVAL = 10;
    if( n > UPDATE_INTERVAL )
    {
        makeCurrent();
        paintGL();
        update();
        n = 0;
    }
    ++n;
    return false;
}

Qtイベントのアイドル状態とディスプレイへの描画処理完了が判定できる方法があれば、もっとましな書き方ができそうです。

Qt カレントディレクトリ内のファイルやディレクトリをリストアップ

2013/08/13
Qt C++ 

Qtでディレクトリ内のファイルをリストアップするコードをメモしておきます。

下記コードのようにQDir::entryList()をコールするとカレントディレクトリのファイルやディレクトリをリストアップします。


QStringList path_list = QDir().entryList();
QStringList::const_iterator path_iter;
for (path_iter = path_list.constBegin(); path_iter != path_list.constEnd(); ++path_iter){
    printf( "%s\n", (*path_iter).toLatin1().data() );
}

Qt eventFilterでイベントを振り分ける

2013/08/12
Qt C++ 

QMainWindowでkeyPressEvent()を使ってキー入力を取得しようとすると、Qt::Key_Right、Qt::Key_Leftなどのキーが取れなかったので、取得する方法がないか探してみました。どうやらinstallEventFilter()を実行してから、eventFilter()を使えば発生したイベントが全部取得できるようだということがわかりました。

下記コードのような感じです。


class MainWin: public QMainWindow
{
public:
    MainWin();
private:
    virtual bool eventFilter(QObject *obj, QEvent *event);
};

MainWin::MainWin()
{
    qApp->installEventFilter(this);
}

bool MainWin::eventFilter(QObject *obj, QEvent *event)
{
	switch(event->type())
    {
    case QEvent::KeyPress:
        printf("Key %d pressed\n", static_cast<QKeyEvent*>(event)->key() );
        break;
    default:
        break;
    }
	return false;
}

下記ページのサンプルが参考になりました。

http://nonspam.blog.shinobi.jp/qt-windows%E3%83%A1%E3%83%A2/eventfilter
%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F

オリジナル画像ビューア開発記録

2013/08/11
Qt 

商用利用可で作者に連絡などが不要なフリーの画像ビューアでいいものがなかなかないので、自分で作ることにしました。

メニュはファイルオープンとセーブしかないという大分簡素な作りですが、ひとまず使えそうなものが完成しました。連番画像の再生にも一応対応させておきました。

しばらく自分で使ってみて使いづらいところが直せたら、フリーソフトとして公開するかもです。

オリジナル映像編集ソフト開発記録 - レイヤーをエフェクトのパラメータにする -

2013/03/23
Qt 

After Effectsの真似事ですが、開発中の映像編集ソフトのエフェクトにレイヤーをパラメータにできる機能を追加しました。エフェクトのプラグインからコンポジションのレイヤーにアクセスできるようになりました。MIDIを使った動画エフェクトを作りたかったんですが、このソフトではMIDIを読めるようにしてあるので、MIDIをエフェクトのパラメータとして使用することができるようになりました。

しかし、設計もなしに思いつきで作り続けているので想像以上に開発に時間がかかってしまっています。最近プログラムばかり書いていて全然創造的な活動をしていないので、そろそろ何か始めたいところです。

Qt QTreeWidgetでアイテム入れ替え後に何か処理を実行する

2013/01/12
Qt 

QTreeWidgetを継承したクラスでレイヤービューを作っていたんですが、ドラッグアンドドロップモードがInternalMoveであるとき、アイテムをドラッグアンドドロップで移動した後にレイヤーの順番変更を反映する処理を実現する方法がわからなくて苦戦しました。

QTreeWidgetクラスのソースコードを呼んでみるとQTreeWidget::dropEvent関数では一度選択されているアイテムを削除してから、ドロップした箇所の後ろに追加するような処理が入っていました。ということで最終的に下記のように仮想メンバ関数であるdropEventを再実装して、関数内でQTreeWidget::dropEventを最初にコールすることで実現できました。よく考えてみれば当たり前のことなんですけど。


void TreeWidgetSample::dropEvent( QDropEvent * drop_event )
{
    this->QTreeWidget::dropEvent( drop_event );

    /* any processing after item order changed */
}

やはりオープンソースのライブラリだと詰まったときにソースコードが見れるのがありがたいと感じます。

Qt QTreeWidgetItemからQModelIndexを取得する

2012/12/31
Qt 

QTreeWidgetクラスはQTreeWidgetItemからQModelIndexを取得するindexFromItem( item, column )というメンバ関数を持っていますが、これがprotectedで宣言されており、継承したクラスでないと使えないという仕様になっています。QTreeWidgetを使っていると各アイテムにWidgetをセットするためにQModelIndexを取得したいことが結構あり、publicにこのメンバ関数にアクセスできないのはとても不便なので、QTreeWidgetのメンバ関数にpublicでindexFromItemのラッパー関数を定義しておくと便利です。


class TreeWidgetSample
    : public QTreeWidget
{
public:
    TreeWidgetSample(QWidget *parent=NULL)
        : QTreeWidget(parent)
    {}
    QModelIndex indexFromItem( QTreeWidgetItem * item, int column = 0 ) const
    {
        return this->QTreeWidget::indexFromItem( item, column );
    }
};

Qt QMdiArea内の子ウィンドウのドロップ処理を制御する

2012/12/16
Qt 

QMdiAreaを使ってMDI内のウィンドウごとにドラッグアンドドロップを制御する方法を模索していたのですが、なかなか簡単な方法が見つからないので、最終的にドラッグアンドドロップをした座標にMDIの子ウィンドウがあるかどうかを識別して、子ウィンドウごとのドロップ時の挙動を制御することにしました。

具体的には下記のような関数を作って子ウィンドウの有無を識別しました。


bool IsOnWidget( QPoint pos, const QWidget* widget )
{
    if( widget==NULL){ return false; }

    QPoint win_pos  = widget->pos();
    QSize  win_size = widget->size();
    int    win_r_bottom_px = win_pos.x() + win_size.width();
    int    win_r_bottom_py = win_pos.y() + win_size.height();

    return ( (win_pos.x() < pos.x())&& (pos.x() < win_r_bottom_px) )
       && ( (win_pos.y() < pos.y())&& (pos.y() < win_r_bottom_py) );
}

もっと簡単な方法があるかもですが、この方法もそんなに大変ではないので使うのは難しくないです。

Qt QListWidgetでドラッグアンドドロップによる要素移動を有効にする

2012/10/08
Qt 

QListWidgetでドラッグアンドドロップによる要素の移動を有効にするにはsetAccessptDrops, setDragEnabledにtrueをセットして、DragDropModeをInternalMoveに設定するとできたのでメモしておきます。


QListWidget *list_widget = new QListWidget();
QListWidgetItem *item1 = new QListWidgetItem(QString("item1"));
QListWidgetItem *item2 = new QListWidgetItem(QString("item2"));
QListWidgetItem *item3 = new QListWidgetItem(QString("item3"));
list_widget->addItem( item1 );
list_widget->addItem( item2 );
list_widget->addItem( item3 );

list_widget->setAcceptDrops( true );
list_widget->setDragEnabled( true );
list_widget->setDragDropMode( QAbstractItemView::DragDropMode::InternalMove );

list_widget->show();

0  1  2  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0213 sec

Copyright(C)2006-2018 wsp All Rights Reserved