Окно перетаскивания QT4 без заголовка

В приложении, в котором я работаю, есть пользовательский интерфейс, который потребовал от меня удалить строку заголовка из главного окна. К сожалению, я не могу понять, как это сделать, чтобы я мог перемещать приложение на экране:)

У меня есть код, который удаляет строку заголовка:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent, Qt::CustomizeWindowHint), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);

Любая идея, как я могу перемещать окно вокруг с помощью другого виджета или самого окна основной формы?

Спасибо

Ответ 1

Самый интуитивный способ сделать это - щелкнуть по поверхности виджета и перетащить. Чтобы достичь этого, вам нужно выполнить несколько шагов.

Метод выглядит следующим образом: Когда пользователь нажимает внутри виджета, задает булевский флаг и сохраняет позицию мыши, а затем, когда кнопка отпускается, установите для нее значение false. Следующий шаг - перемещение виджета. В mouseMoveEvent проверьте, установлен ли флаг. Если он установлен, возьмите новое положение мыши. Рассчитайте разницу между новой позицией и сохраненной. Затем установите положение окна в исходное положение + вычисленное движение мыши. Затем сохраните новую позицию мыши.

Необходимый код:

ПРЕДУПРЕЖДЕНИЕ. Этот пример кода неверен и приведет к скачкообразному поведению при перетаскивании окна. Вместо этого используйте код Пример Qt Shaped Clock.

/// 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;
    }
}

Ответ 2

Вы должны попробовать это вместо

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;
    }
}

Ответ 3

Я не очень хорошо помню, но вы можете зарегистрировать настраиваемый обработчик событий, легко есть много примеров в google. проверьте событие мыши, перед этим вы можете использовать QObject:: sender() и получить метаобъект, чтобы узнать класс объекта tha, если объект является qframe или qwidget или другим классом, который вы хотите использовать для перемещения окна, то вы можете применить логику для перетаскивания окна. профи - это то, что вы можете использовать со всеми окнами и рамками без переопределения каждого из них с событиями мыши.