[ 新規 | 編集 | 差分 ] [ 検索 | 一覧 | FrontPage ] [ 履歴 (RSS) | 差分履歴 (RSS) ] [ ログイン ]
【PR】Amazon | SL-C3000 | SL-C1000(3/18発売!) | SL-C860 | SL-6000W | SL-6000L | SL-6000N

開発TIPS/イベントハンドラ

編集

議論中

KeyHelperの新機種対応がらみで忙しいのはわかってますが、

ちょっと悩んでることがあるので、ヒントとかご存知無いかと思って来て見ました。

QAccel *acPaste = new QAccel( this );

acPaste->connectItem( acPaste->insertItem( Key_BackSpace ), this, SLOT( UptoDir() ) );

とかして、キー入力を拾ったあと、他の設定項目を比較して

特に処理が発生しないとき、通常のイベントハンドラに戻したいんですが、

こういう時って、どういう処理をすれば元処理に戻せたりするんでしょう?

多分、どっかのクラスの関数をKey_BackSpaceを引数にして呼び出せばいいんじゃないかと思うんですが、

ちょっと探しきれていないんですよね。ご面倒なら時間かけて探してみます。

でも、よかったら(何かご存知でしたら)ヒントだけでも・・・とか思ってですね。

うーん、教えて君はあんまりやりたくないんですがちょっとこの件は解決できるなら早めに知りたくて・・・すいません。

#多分、続きはWikiの方でやったほうがいいんでしょうね。

#ご迷惑ばかりですいません。

通常のイベントハンドラでデフォルトのイベントハンドラをコールする方法なら
知ってるんですけど、アクセラレーターのシグナルをスロットに接続した場合はどうやるんでしょうねえ?

ちなみにeventをオーバーライドして、処理しなかった場合はデフォルトの処理をさせる場合。
(記憶のみでコードを書いているので間違っている可能性有り…)

bool event(QKeyEvent* e)
{
  if(e->type == QEvent::KeyPress){
    QKeyEvent* ke = (QKeyEvent*)e;
    if(ke->key() == Qt::Key_Backspace){
      /* アプリケーション固有の処理をした場合 */
      return false;
    }
  }
  /* デフォルトの処理をさせるので親クラスのメソッドをコール */
  return QWidget::event(e);
}

アクセラレータの処理をするスロットでQWidget::event()をコールしたらどうなるんでしょう?
もしくはQWidget::keyPressEvent()?
なんかどっちも無限ループしそうな予感も…(^^;


これってeEditのファイル選択ダイアログの実装ですよね?
だとしたら、QListView(ですよね?)を継承したクラスを作って
keyPressEvent()をオーバーライドするのが一番スマートかも?
#昨日は眠い中書いたんで↑のしか思いつきませんでしたが…(笑)
QAccelってトップレベルウィジェットの全ての子に対するキー操作を
扱うためのものだから多分こっちの方が素直です。

void MyListView::keyPressEvent(QKeyEvent* ke)
{
  if(ke->key() == Qt::Key_BackSpace){
    /* バックスペースの処理 */     
  } else {
    /* デフォルトの処理をさせるので親クラスのメソッドをコール */
    QListBox::keyPressEvent(ke);
  }
}

[[#rcomment]]

01737