如何将 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.
使用代码:使用QMainWindow
的setStyleSheet(...)
方法并将样式sheet作为字符串传递。
我有这样的显示 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.使用代码:使用
QMainWindow
的setStyleSheet(...)
方法并将样式sheet作为字符串传递。