QT4 Drag Window без заголовка - PullRequest
       16

QT4 Drag Window без заголовка

11 голосов
/ 01 сентября 2009

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

Код, который удаляет строку заголовка, следующий:

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

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

Спасибо

Ответы [ 3 ]

13 голосов
/ 01 сентября 2009

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

Метод работает следующим образом: когда пользователь нажимает внутри виджета, устанавливает логический флаг и сохраняет положение мыши, а затем, когда кнопка отпущена, установите для него значение 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;
    }
}
3 голосов
/ 19 августа 2013

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

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;
    }
}
0 голосов
/ 07 декабря 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...