我有一个这样的显示窗口:
以上显示小部件是QGraphicsView
个小部件(它们位于QGridLayout
),我想要实现的是:
当用户点击MainWindow
时,我想抓住该点击的位置并确定哪个QGraphicsView
小部件包含该位置,并将所选的QGraphicsView
小部件的边框设置为绿色。并且一次只能选择一个QGraphicView
窗口小部件。
有人能给我一些想法吗?
由于
答案 0 :(得分:1)
如果您只想更改鼠标悬停时的边框颜色,则不需要这么复杂的编程。 Qt supports样式表,就像CSS一样。
在这种情况下,将以下样式表附加到QGraphicsView:hover {
border-style: solid;
border-width: 2px;
border-color: green;
}
。
MainWindow
有两种方法可以完成这项工作:
使用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);
}