2016-09-06 2 views
0

에 위치를 클릭 : 디스플레이 위젯 위를 전달하는 방법을 QMainWindow 마우스 내가이 같은 표시창이를 QGraphicsView

enter image description here

은 (그들이 QGridLayout에) QGraphicsView 위젯입니다 및 내가 달성하고자하는 것입니다 : MainWindow에서 사용자가 클릭, 나는 그 위치를 클릭 포착하고 QGraphicsView 위젯이 그 위치를 포함하는 결정과 녹색 색상이 선택 QGraphicsView 위젯의 테두리를 설정할

. 한 번에 하나의 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

답변 해 주셔서 감사합니다. 한가지 더 질문 : 사용자가 QGridLayout에'QGraphicsView' 위젯의 수를 동적으로 할당 할 수있게하면 어떻게됩니까? 그런 다음 동일한 선택 문제를 해결할 적절한 방법이 있습니까? 현재 구현은 고정 된 수의'QGraphicsView' 위젯을위한 것입니다. – Johnnylin

+0

사용자가 QGraphicsViews의 수를 동적으로 설정하면 approch는 두 위젯과 동일합니다. 각 QGraphicsView에 대해 이벤트 필터를 설정하고 eventFilter 메서드에서 어떤 위젯을 선택했는지 결정합니다. 나는 문제가 보이지 않는다. 무슨 차이가 있을지 설명해 주시겠습니까? –

+0

확인. 나는 이것을 시험해보고 효과가 있는지 살펴볼 것입니다. – Johnnylin

1

만 마우스를 가져가의 테두리 색상을 변경하려면, 복잡한 프로그래밍이 필요하지 않습니다. CSS와 마찬가지로 Qt supports 스타일 시트.

이 경우 다음 스타일 시트를 MainWindow에 첨부하면 충분합니다.

  • 디자이너를 사용하여 : : 먼저 styleSheet에 해당 속성 패널을 클릭의 MainWindow 다음을 선택하여 복사 및 붙여 넣기

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

    enter image description here

    이 작업이 완료 얻을 수있는 두 가지 방법이있다 스타일 시트.

  • 코드 사용 : 메서드를 QMainWindow으로 사용하고 스타일 시트를 문자열로 전달하십시오.

+0

답변 해 주셔서 감사합니다. 사실, 나는'QComboBox'를 설정하여 사용자가 필요한'QGraphicsView' 위젯의 수를 선택할 수있게했습니다. 예를 들어, 사용자가'QComboBox'를 9로 설정하면 위 이미지가 결과입니다. 그런 다음 사용자가 클릭 한'QGraphicsView' 위젯을 결정하고 선택한 'QGraphicsView' 위젯에 비디오 스트림을 삽입하고 싶습니다. – Johnnylin

+0

@Johnnylin 간단합니다. ['QSignalMapper'] (http://doc.qt.io/qt-5/qsignalmapper.html#details)를 살펴보십시오. 테두리를 스타일링하기 위해, 스타일 시트는 괜찮습니다. –