2016-10-25 6 views
0

アプリケーションのメインウィンドウにQt Designerを使用していて、その中にさまざまなウィジェットが含まれている場合、これらのウィジェットをsepcificallyでさらにカスタマイズするにはどうすればいいですか?たとえば、メインアプリケーション内にQTableViewウィジェットがあります。アプリケーションをデバッグすると、ui_myapplication.hファイルがQt Designer .uiフォームから作成されます。そのファイルに定義されているウィジェットに余分なものを追加したいとします。実行時に作成された場合、どうすればよいでしょうか?特定のフォームウィジェットにshift-click修飾子を実装していますか?

例:myApplication.cpp

、私はこのコードブロックを持っている:

void myApplication::mousePressEvent(QMouseEvent* event) { 
    if(event->modifiers() & Qt::ShiftModifier) { 
    if(event->button() == Qt::LeftButton) { 
     qDebug() << "shift modifier"; 
     ui->tableView->setSortingEnabled(false); 
    } 
    } 
} 

これは私が欲しいものに似ていますが、正確ではありません。私がShiftを保持し、列ヘッダーを左クリックするとテーブルのソート機能を無効にするtableViewという名前のQTableViewウィジェット(これはQt Designerで作成したメインアプリケーションに含まれています)を持つことです。 (最終的な目標は、Shiftキーを押しながらクリックすると短時間の列並べ替えが無効になるので、列を並べ替えるのではなく列内のすべての項目を選択できるようにすることです)。

上記のコードは、メインアプリケーションの一番下(他のウィジェットがない場所)でShift +クリックすると機能します。それは理にかなっている。しかし、tableViewウィジェット内でShift +クリックするとqDebug() << "shift modifier";行がトリガーされるようにするにはどうすればよいですか? (擬似コード):

私はこれに似た何かをしたいと思います

void myApplication::mousePressEvent(QMouseEvent* event) { 
    if(target == ui->tableView->horizontalheader() && event->modifiers() & Qt::ShiftModifier) { 
    if(event->button() == Qt::LeftButton) { 
     qDebug() << "shift modifier"; 
     ui->tableView->setSortingEnabled(false); 
    } 
    } 
} 

私はこれをどのように行うことができますか?

EDIT:私は、特定のウィジェットを対象とするイベントフィルタを使用してこれを行うことができると私は信じていました。正しい軌道にいるのですか?

EDIT 2:以下gougの答えにおかげで、私はQTableViewをサブクラス化し、新しいクラスに私の既存フォームのQTableViewを促進することにより、必要なものを達成することができました。以下を参照してください:

mytableview.h

#ifndef MYTABLEVIEW_H 
#define MYTABLEVIEW_H 

#include "mytableview.h" 
#include <QTableView> 

class MyTableView : public QTableView 
{ 
    Q_OBJECT 

public: 
    explicit MyTableView(QWidget * parent = 0); 

    ~MyTableView(); 

protected: 
    void mousePressEvent(QMouseEvent *event); 

}; 

#endif // MYTABLEVIEW_H 

mytableview.cpp

#include "mytableview.h" 
#include <QDebug> 

MyTableView::MyTableView(QWidget* parent) 
{ 
} 

MyTableView::~MyTableView() 
{ 
} 

void MyTableView::mousePressEvent(QMouseEvent* event) { 
    if(event->modifiers() & Qt::ShiftModifier) { 
     if(event->button() == Qt::LeftButton) { 
     qDebug() << "shift modifier"; 
     setSortingEnabled(false); 
     } 
    } 
} 

答えて

3

あなたはここに使用できる様々なアプローチのカップルがあります。あなたはQTableViewをサブクラス化することができます。その後、Qt Designerでは、通常通りQTableViewを配置しますが、それを派生クラスに昇格します。生成されたコードは、QTableViewではなくクラスのインスタンスを作成します。 Qtデザイナで、テーブルビューを右クリックし、[プロモート]オプションから選択します。初めてクラスの詳細を入力する必要があります。テーブルビューに実装したい他のカスタム動作がある場合は、特にこのルートに行く傾向があります。

また、新しいクラスを作成し、それをQTableViewのイベントフィルタとしてインストールすることもできます。あなたの新しいクラスはQTableViewに行く前にイベントを取得し、それに応じて行動することができます。 Qt AssistantでinstallEventFilterを調べると、これを行う方法の詳細が表示されます。

+0

ありがとうございました!あなたの答えを出発点として、私はこのリソースがサブクラス化に来たときに貴重なものであることも知った:http://www.qtcentre.org/threads/43710-Subclass-QLabel。私はまた、 "EDIT"セクションの元の質問に、より完全な答えを加えます。 – orbit

関連する問題