1

发生了奇怪的事情:我需要在标签上使用橡皮筋。这是我的代码:

    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-150 像素低一点。

我究竟做错了什么 ?

4

1 回答 1

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 的小部件上,它将如何实现。由于您在与另一个小部件鼠标事件不同的小部件上使用它,因此您必须映射坐标。

希望有帮助。

于 2013-05-13T17:00:13.223 回答