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

How to Pass QMainWindow mouse clicked position to QGraphicsView

我有这样的显示 window:

上面的显示小部件是 QGraphicsView 个小部件(它们在 QGridLayout 中),我想要实现的是:

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

任何人都可以给我一些想法吗?

谢谢

您可以将 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);
}

如果您只想在鼠标悬停时更改边框颜色,则不需要这么复杂的编程。 Qt supports风格sheets,就像CSS.

在这种情况下,将以下样式sheet附加到您的MainWindow就足够了。

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

有两种方法可以完成此操作:

  • 使用设计器:首先 select MainWindow 然后在其属性面板中单击 styleSheet 并复制并粘贴样式 sheet.

  • 使用代码:使用QMainWindowsetStyleSheet(...)方法并将样式sheet作为字符串传递。