QRubberBand在一个明确的标签上

时间:2013-05-13 16:54:15

标签: qt drawing selection rubber-band

发生了奇怪的事情:我需要在标签上使用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左右。

我做错了什么?

1 个答案:

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

希望有所帮助。