发生了奇怪的事情:我需要在标签上使用rubberBand。 这是我的代码:
QRubberBand *rubberBand;
QPoint mypoint;
void MainWindow::mousePressEvent(QMouseEvent *event){
mypoint = event->pos();
rubberBand = new QRubberBand(QRubberBand::Rectangle, ui->label_2);//new rectangle band
rubberBand->setGeometry(QRect(mypoint, ui->label_2->size()));
rubberBand->show();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event){
rubberBand->setGeometry(QRect(mypoint, event->pos()).normalized());//Area Bounding
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event){
rubberBand->hide();// hide on mouse Release
rubberBand->clearMask();
}
一切正常,但只有一个问题 - rubberBound开始油漆低一点,然后光标设置在100-150px左右。
我做错了什么?
答案 0 :(得分:1)
event->pos()
与您的标签和橡皮筋的坐标系不同。
http://qt-project.org/doc/qt-4.8/qwidget.html#mapFrom
http://qt-project.org/doc/qt-4.8/qwidget.html#mapFromGlobal
http://qt-project.org/doc/qt-4.8/qwidget.html#mapFromGlobal
http://qt-project.org/doc/qt-4.8/application-windows.html
http://qt-project.org/doc/qt-4.8/qwidget.html#geometry-prop
http://qt-project.org/doc/qt-4.8/qwidget.html#rect-prop
您需要将event->pos()
映射到不同的坐标系以补偿偏移。
编辑:这是一个例子。
// In your constructor set rubberBand to zero.
rubberBand = 0;
void MainWindow::mousePressEvent(QMouseEvent *event){
mypoint = ui->label->mapFromGlobal(this->mapToGlobal(event->pos()));
// mypoint = ui->label->mapFrom(this, event->pos());
// mypoint = this->mapTo(ui->label, event->pos());
if(rubberBand == 0) // You should add this to not have a memory leak
rubberBand = new QRubberBand(QRubberBand::Rectangle, ui->label_2);//new rectangle band
rubberBand->setGeometry(QRect(mypoint, ui->label_2->size()));
rubberBand->show();
}
在QRubberBand
描述中,它显示了如果在触发了mouseEvents的小部件上使用它,它将如何实现。由于您在与其他小部件鼠标事件不同的小部件上使用它,因此您必须映射坐标。
希望有所帮助。