我正在处理的应用程序有一个自定义UI,要求我从主窗口中删除标题栏。不幸的是,我无法弄清楚如何制作它以便我可以在屏幕上移动应用程序:)
我删除标题栏的代码如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent, Qt::CustomizeWindowHint), ui(new Ui::MainWindowClass)
{
ui->setupUi(this);
任何想法如何使用另一个小部件或主窗体本身移动窗口?
由于
答案 0 :(得分:13)
最直观的方法是点击小部件表面并拖动。为了实现这一目标,您需要遵循一些步骤。
方法如下:当用户按下窗口小部件时,设置布尔标志并存储鼠标的位置,然后当释放按钮时,将其设置为false。下一步是移动小部件。在mouseMoveEvent中,检查是否设置了标志。如果已设置,请采用鼠标的新位置。计算新位置和存储位置之间的差异。然后,将窗口的位置设置为原始位置+计算的鼠标移动。然后存储新的鼠标位置。
所需的代码是:
警告:此代码示例不正确,导致拖动窗口时出现跳跃行为。请改用Qt Shaped Clock example中的代码。
/// Header contents:
class MyWidget : public QMainWindow
{
protected:
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
private:
QPoint mLastMousePosition;
bool mMoving;
}
/// Source:
void MyWidget::mousePressEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
mMoving = true;
mLastMousePosition = event->pos();
}
}
void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
{
this->move(this->pos() + (event->pos() - mLastMousePosition));
mLastMousePosition = event->pos();
}
}
void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
mMoving = false;
}
}
答案 1 :(得分:3)
你应该试试这个
class MyWidget : public QMainWindow
{
protected:
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
private:
QPoint mLastMousePosition;
bool mMoving;
}
/// Source:
void MyWidget::mousePressEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
mMoving = true;
mLastMousePosition = event->pos();
}
}
void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
{
this->move(this->pos() + (event->pos() - mLastMousePosition));
}
}
void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
mMoving = false;
}
}
答案 2 :(得分:0)
我不太清楚,但你可以注册一个自定义事件处理程序,很容易在google上有这么多的例子。检查鼠标事件,在此之前你可以使用QObject :: sender()并获取元对象以了解如果对象是qframe或qwidget或要用于移动窗口的另一个类,则按下对象的类。然后你可以应用逻辑来拖动窗口。专业人士可以使用所有窗口和框架,而无需使用鼠标事件重新实现每个窗口和框架