我的小部件上有一个QGraphicsView窗口,只是放入一个鼠标滚轮的事件,放大图像。
然而,只要我放大滚动条,鼠标滚轮上的滚动功能就会覆盖我的缩放功能。
我想知道是否有任何方法我可以一起删除所有滚动并添加拖动移动选项或者可以使用CTRL和鼠标滚轮进行缩放和鼠标滚轮单独控制滚动
这是我的缩放功能(我意识到并不完美),但如果有人能说明这将是一个奖金
提前欢呼
void Test::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
{
ui->graphicsView->scale(2,2);
}
else
{
ui->graphicsView->scale(0.5,0.5);
}
}
答案 0 :(得分:4)
您为包含QGraphicsView的QWidget / QMainWindow重新实现了wheelEvent,但是,QGraphicsView的wheelEvent保持不变。
您可以从QGraphicsView派生,为派生类重新实现wheelEvent并使用派生类而不是QGraphicsView - 这样您甚至不需要在QWidget / QMainWindow中使用wheelEvent,并且您可以自定义重新实现的wheelEvent来执行您想要的操作。这样的事情:
标题文件:
class myQGraphicsView : public QGraphicsView
{
public:
myQGraphicsView(QWidget * parent = nullptr);
myQGraphicsView(QGraphicsScene * scene, QWidget * parent = nullptr);
protected:
virtual void wheelEvent(QWheelEvent * event);
};
源文件:
myQGraphicsView::myQGraphicsView(QWidget * parent)
: QGraphicsView(parent) {}
myQGraphicsView::myQGraphicsView(QGraphicsScene * scene, QWidget * parent)
: QGraphicsView(scene, parent) {}
void myQGraphicsView::wheelEvent(QWheelEvent * event)
{
// your functionality, for example:
// if ctrl pressed, use original functionality
if (event->modifiers() & Qt::ControlModifier)
{
QGraphicsView::wheelEvent(event);
}
// otherwise, do yours
else
{
if (event->delta() > 0)
{
scale(2, 2);
}
else
{
scale(0.5, 0.5);
}
}
}
答案 1 :(得分:3)
可以使用以下代码禁用滚动:
ui->graphicsView->verticalScrollBar()->blockSignals(true);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->horizontalScrollBar()->blockSignals(true);
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
答案 2 :(得分:1)
我认为你的问题有一个简单的答案..要禁用滚动条只需设置滚动条策略(QGraphicsView只是QScrollView),所以步骤1)
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
将禁用滚动条..
第2步)(如果你想保持简单)
QGraphicsView * pView; // pointer to your graphics view
pView->setInteractive(true);
pView->setDragMode(QGraphicsView::ScrollHandDrag);
这是获得所需结果的最快方式