如何将QMainWindow鼠标点击位置传递给QGraphicsView

时间:2016-09-06 14:49:52

标签: c++ qt mouseevent qgraphicsview

我有一个这样的显示窗口:

enter image description here

以上显示小部件是QGraphicsView个小部件(它们位于QGridLayout),我想要实现的是:

当用户点击MainWindow时,我想抓住该点击的位置并确定哪个QGraphicsView小部件包含该位置,并将所选的QGraphicsView小部件的边框设置为绿色。并且一次只能选择一个QGraphicView窗口小部件。

有人能给我一些想法吗?

由于

2 个答案:

答案 0 :(得分:1)

如果您只想更改鼠标悬停时的边框颜色,则不需要这么复杂的编程。 Qt supports样式表,就像CSS一样。

在这种情况下,将以下样式表附加到QGraphicsView:hover { border-style: solid; border-width: 2px; border-color: green; }

就足够了
MainWindow

enter image description here

有两种方法可以完成这项工作:

  • 使用Designer:首先选择styleSheet,然后在其属性面板中单击setStyleSheet(...)并复制并粘贴样式表。

  • 使用代码:使用QMainWindow的{​​{1}}方法,并将样式表作为字符串传递。

答案 1 :(得分: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);
}