我的QMainWindow
有一个QWidget
。出现QWidget
,其原点设置在QMainWindow
的鼠标按下事件中。然后,在QMainWindow
的鼠标移动事件中,设置QWidget
的几何图形,使得用户在QMainWindow
之上绘制一个矩形。这就是我的做法:
void MyQMainWindow::mousePressEvent(QMouseEvent * E) {
QPoint pos = e->pos();
myQWidget->setGeometry(pos.x(), pos.y(), 0, 0);
myQWidget->show();
}
void MyQMainWindow::mouseMoveEvent(QMouseEvent * e) {
QPoint pos = e->pos();
QPoint prv = myQWidget->pos();
int w = pos.x() - prv.x();
int h = pos.y() - prv.y();
myQWidget.setGeometry(prv.x(), prv.y(), w, h);
}
void MyQMainWindow::mouseReleaseEvent(QMouseEvent *) {
myQWidget.hide();
}
这种方法的问题在于,当我向上拖动鼠标时,或者向左拖动我单击的位置。我对w
和h
的计算是否定的,因此窗口无法正确调整大小(或根本不调整大小)。
我意识到向上/向左移动意味着我需要更改小部件的原点,同时通过根据需要增加宽度/高度来保持小部件的右下角,但我该怎么办此?
谢谢!
答案 0 :(得分:1)
我会做这样的事情:
void MyQMainWindow::updateWidgetGeometry()
{
if (_initial == QPoint(-1,-1)) {
return;
}
x = qMin(_initial.x(), _current.x());
y = qMin(_initial.y(), _current.y());
w = abs(_initial.x() - _current.x());
h = abs(_initial.y() - _current.y());
myQWidget.setGeometry(x, y, w, h);
}
void MyQMainWindow::mousePressEvent(QMouseEvent * E)
{
_initial = e->pos();
_current = e->pos();
updateWidgetGeometry()
myQWidget->show();
}
void MyQMainWindow::mouseMoveEvent(QMouseEvent * E)
{
_current= e->pos();
updateWidgetGeometry()
}
void MyQMainWindow::mouseReleaseEvent(QMouseEvent *)
{
_current = QPoint(-1,-1);
_initial = QPoint(-1,-1);
myQWidget.hide();
}
在没有编译器的情况下输入它。
顺便说一句,您可能还需要setMouseTracking(true),这样如果鼠标移动事件发生在窗口小部件内,MyQMainWindow就会处理它。我不确定那一点。