2016-09-06 2 views
0

У меня есть окно дисплея, как это:Как пройти QMainWindow мыши щелкнула позицию QGraphicsView

enter image description here

Выше виджеты отображений являются QGraphicsView виджетами (они находятся в QGridLayout) и то, что я хочу добиться того, что :

, когда пользователь нажимает на MainWindow, я хочу, чтобы захватить, что нажал позицию и решить, QGraphicsView виджет содержит эту позицию и установить границы этого выбранного QGraphicsView виджета зеленого цвета. И только один виджет QGraphicView может быть выбран одновременно.

Может ли кто-нибудь дать мне несколько идей?

Благодаря

+0

Просто переопределите 'mousePressEvent'. Фокусная обработка также может быть случайным. – ilotXXI

+0

@ilotXXI переопределяет 'mousePressEvent' в' MainWindow' или в каждом из виджета 'QGraphicView'? – Johnnylin

ответ

0

Вы можете использовать installEventFilter для QGraphicsViews и обнаруживающие события нажатия мыши на них. Таким образом, вы можете определить текущий вид и создать границу для него, как хотите. Небольшой пример:

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

Спасибо за ваш ответ. Еще один вопрос: если я разрешаю пользователю динамически выделять количество виджета 'QGraphicsView' в' QGridLayout'. Тогда есть ли подходящий способ справиться с одной и той же проблемой выбора? Ваша текущая реализация предназначена для фиксированного количества виджета 'QGraphicsView'. – Johnnylin

+0

Если пользователь установил динамическое число QGraphicsViews, то будет выполнено то же самое, что и для двух виджетов. Установите фильтр событий для каждого QGraphicsView и в методе eventFilter определите, какой виджет был выбран. Я не вижу проблемы. Можете ли вы описать, в чем разница? –

+0

ОК. Я попробую это и посмотрю, работает ли оно. – Johnnylin

1

Если вы хотите изменить цвет границы на наведению мыши, вам не понадобится такое сложное программирование. Qt supports таблицы стилей, как и CSS.

В этом случае достаточно добавить следующую таблицу стилей к вашему MainWindow.

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

enter image description here

Там два способа добиться этого:

  • с помощью конструктора: Сначала выберите MainWindow, а затем в его свойствах панели жмем на styleSheet и скопировать и вставить таблица стилей.

  • Использование кода: используйте setStyleSheet(...) метод QMainWindow и передайте таблицу стилей в виде строки.

+0

Спасибо за ваш ответ. Фактически, я установил 'QComboBox', чтобы позволить пользователю выбирать количество виджетов' QGraphicsView', в которых они нуждаются. Например, пользователь установил 'QComboBox' равным 9, то приведенное выше изображение является результатом. Затем я хочу решить, какой виджет 'QGraphicsView' пользователь щелкнул и вставить видеопоток в выбранный виджет' QGraphicsView'. – Johnnylin

+0

@Johnnylin Это просто, просто взгляните на ['QSignalMapper'] (http://doc.qt.io/qt-5/qsignalmapper.html#details). Для стилизации рамки, таблицы стилей в порядке. –

Смежные вопросы