2016-09-06 6 views
0

に位置をクリック:表示ウィジェット上は、私はこのような表示窓を持ってQGraphicsView

enter image description here

QGraphicsViewウィジェットです(彼らはQGridLayoutである)と私が達成したいことということです:

MainWindowでのユーザーのクリックが、私はそのクリックした位置をつかむと、ウィジェットがその位置を含んでおり、緑色にその選択QGraphicsViewウィジェットの境界線を設定したQGraphicsView決定したいとき。一度に選択できるのは1台のQGraphicViewウィジェットだけです。

誰か私にいくつかのアイデアを教えてもらえますか?

おかげ

+0

「mousePressEvent」を再実装するだけです。フォーカス処理も可能です。 – ilotXXI

+0

@ilotXXI 'MainWindow'またはそれぞれの' QGraphicView'ウィジェットで 'mousePressEvent'を再実装しますか? – Johnnylin

答えて

0

あなたはQGraphicsViewsためinstallEventFilterを使用し、それらの上にマウスプレスイベントを検出することができます。したがって、現在のビューを定義し、必要に応じて境界線を作成することができます。小さな例:

main.cppに

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QGraphicsView> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

public: 
    bool eventFilter(QObject* watched, QEvent* event) override; 


private: 
    Ui::MainWindow *ui; 
    QGraphicsView* view1_; 
    QGraphicsView* view2_; 
    QGraphicsView* selectedView_; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QGridLayout> 
#include <QMessageBox> 
#include <QDebug> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), 
     view1_(nullptr), 
     view2_(nullptr), 
     selectedView_(nullptr) 
{ 
    ui->setupUi(this); 
     QGridLayout* grid = new QGridLayout(this->centralWidget()); 
     view1_ = new QGraphicsView(this); 
     view2_ = new QGraphicsView(this); 
     grid->addWidget(view1_, 0, 0); 
     grid->addWidget(view2_, 0, 1); 
     view1_->viewport()->installEventFilter(this); 
     view2_->viewport()->installEventFilter(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

bool MainWindow::eventFilter(QObject* watched, QEvent* event) 
{ 
    qDebug() << event->type(); 
    if (event->type() == QEvent::MouseButtonPress) 
    { 
     if (watched == view1_->viewport()){ 
      selectedView_ = view1_; 
      QMessageBox::information(this, "!", "First"); 
      return false; 
     } 
     else if (watched == view2_->viewport()){ 
      selectedView_ = view2_; 
      QMessageBox::information(this, "!", "Second"); 
      return false; 
     } 
    } 
    return QMainWindow::eventFilter(watched, event); 
} 
+0

あなたの答えをありがとう。もう1つの質問: 'QGridLayout'に' QGraphicsView'ウィジェットの数を動的に割り当てることができるかどうか。それでは、同じ選択問題に対処する適切な方法はありますか?現在の実装は固定数の 'QGraphicsView'ウィジェット用です。 – Johnnylin

+0

ユーザがQGraphicsViewsの数を動的に設定した場合、approchは2つのウィジェットと同じになります。各QGraphicsViewのイベントフィルタを設定し、どのウィジェットが選択されたかをeventFilterメソッドで決定します。私は問題を見ない。違いが何であるか説明できますか? –

+0

OK。私はこれを試して、それが動作するかどうかを見ます。 – Johnnylin

1

あなただけのマウスのホバー上の境界線の色を変更したい場合は、そのような複雑なプログラミングは必要ありません。 CSSのようにQt supportsスタイルシート。

この場合、MainWindowに次のスタイルシートを添付すれば十分です。

QGraphicsView:hover { 
    border-style: solid; 
    border-width: 2px; 
    border-color: green; 
} 

enter image description here

これを成し遂げるには二つの方法があります:

Designerを使用
  • :まずMainWindowを選択し、そのプロパティパネルのクリックでstyleSheetにし、コピー&ペーストスタイルシート。

  • setStyleSheet(...)メソッドをQMainWindowとし、スタイルシートを文字列として渡します。

+0

あなたの答えをありがとう。実際には、ユーザが必要な 'QGraphicsView'ウィジェットの数を選択できるように' QComboBox'を設定しました。たとえば、ユーザーが 'QComboBox'を9に設定すると、上記のイメージが結果になります。次に、ユーザがクリックした 'QGraphicsView'ウィジェットを決定し、その選択した' QGraphicsView'ウィジェットにビデオストリームを挿入したいと思います。 – Johnnylin

+0

@Johnnylin簡単ですが、['QSignalMapper'](http://doc.qt.io/qt-5/qsignalmapper.html#details)を見てください。境界をスタイリングするために、スタイルシートは大丈夫です。 –

関連する問題