我在Qt5中制作了一个无框窗口。现在,我需要指定一些可拖动区域(QFrame)来移动窗口。如果我像时钟示例一样定义 mouseMoveEvent() 和 mousePressEvent() ,则窗口将变得完全可拖动...
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
move(event->globalPos() - dragPos);
event->accept();
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
dragPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
我应该使用 mouseMoveEvent() 和 mousePressEvent() 创建 QFrame 子类吗?
如果是,怎么办?
最佳答案
您可以使用事件过滤器,在这种情况下,无需子类化即可完成此任务:
QPoint dragPos;//somewhere
//...
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->frame && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
if (ev->buttons() & Qt::LeftButton)
{
dragPos = ev->globalPos() - ui->frame->geometry().topLeft();
}
}
if (obj == ui->frame && event->type() == QEvent::MouseMove)
{
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
if (ev->buttons() & Qt::LeftButton)
{
ui->frame->move(ev->globalPos() - dragPos);
}
}
return QObject::eventFilter(obj, event);
}
要使用eventFilter
,您还应该:
protected:
bool eventFilter(QObject *obj, QEvent *event);//in header
和
qApp->installEventFilter(this);//in constructor
使用此代码,我可以轻松拖动我的 ui->frame
关于c++ - Qt5 - 如何在无框窗口中指定一些可拖动区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26848569/