QGraphicsview区域选择
时间: 2023-09-08 11:16:21 浏览: 323
在Qt中,可以通过QGraphicsView类实现图形界面的绘制和交互。如果想要实现QGraphicsView区域选择的功能,可以使用QRubberBand类。
QRubberBand类是一个用于绘制矩形框的类,可以通过鼠标拖动的方式实现矩形的绘制。将QRubberBand类和QGraphicsView类结合起来使用,可以实现QGraphicsView区域选择的功能。
以下是一个基本的示例代码:
```cpp
#include <QtWidgets>
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent)
{
setRubberBandSelectionMode(Qt::IntersectsItemBoundingRect);
}
protected:
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
m_origin = event->pos();
if (!m_rubberBand)
m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
m_rubberBand->setGeometry(QRect(m_origin, QSize()));
m_rubberBand->show();
}
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent* event) override
{
if (m_rubberBand)
m_rubberBand->setGeometry(QRect(m_origin, event->pos()).normalized());
QGraphicsView::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
if (m_rubberBand)
{
m_rubberBand->hide();
QRectF rect = mapToScene(m_rubberBand->geometry()).boundingRect();
emit selectionChanged(rect);
}
}
QGraphicsView::mouseReleaseEvent(event);
}
signals:
void selectionChanged(const QRectF& rect);
private:
QRubberBand* m_rubberBand = nullptr;
QPoint m_origin;
};
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget* parent = nullptr) : QMainWindow(parent)
{
QGraphicsScene* scene = new QGraphicsScene(this);
for (int i = 0; i < 100; ++i)
{
QGraphicsRectItem* item = scene->addRect(i * 50, 0, 50, 50);
item->setBrush(Qt::blue);
}
m_view = new GraphicsView(this);
m_view->setScene(scene);
connect(m_view, &GraphicsView::selectionChanged, this, &MainWindow::onSelectionChanged);
setCentralWidget(m_view);
}
private:
void onSelectionChanged(const QRectF& rect)
{
qDebug() << "Selection changed:" << rect;
}
GraphicsView* m_view;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
```
在上述代码中,我们首先继承了QGraphicsView类,并重写了mousePressEvent、mouseMoveEvent和mouseReleaseEvent等事件处理函数。在mousePressEvent中,我们使用QMouseEvent的pos函数获取鼠标点击位置,如果是左键按下,则创建QRubberBand对象,并设置它的起始位置为鼠标点击位置。在mouseMoveEvent中,我们不断更新QRubberBand的位置和大小以跟随鼠标移动。在mouseReleaseEvent中,我们获取QRubberBand的位置和大小,并使用mapToScene函数将其转换为场景坐标系下的矩形,然后通过信号selectionChanged将其传递出去。
在MainWindow类中,我们创建了一个QGraphicsScene,并向其中添加了100个蓝色矩形。然后我们创建了一个GraphicsView对象,并将其设置为主窗口的中心窗口。最后我们连接了GraphicsView的selectionChanged信号到onSelectionChanged槽函数,以便在选择区域发生变化时进行响应。
阅读全文