Qt изменяет размеры бездискового виджета на MacOSX

94
17

Мне нужно создать бездисковый виджет в Qt, и он должен быть изменен. Приложение будет работать под Windows и Mac OSX.

Если я использую: setWindowFlags(Qt::FramelessWindowHint); Я могу изменить размер окна из нижнего правого угла (появляется QSizeGrip, я думаю, он включен в виджет QMainWindow).

Я могу добавить захваты в каждом углу, но я хочу, чтобы окно изменялось с боков (а не только на углы). Есть ли простой способ сделать его изменяемым по размеру со всех сторон, как обычное окно?

Для Windows существует обходной путь, который заключается в переопределении обработчика nativeEvent: Qt/Windows, изменяемое размерное окно без рамки, но я не смог найти решение для платформы Mac OSX.

спросил(а) 2017-07-19T13:49:00+03:00 2 года, 4 месяца назад
1
Решение
83

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

    #include <QtWidgets>

class Frame : public QFrame
{
public:

Frame()
{
m_mouse_down = false;
setFrameShape(Panel);

// Make this a borderless window which can't
// be resized or moved via the window system
setWindowFlags(Qt::FramelessWindowHint);
setMouseTracking(true);

m_content = new QWidget(this);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(m_content);
layout->setMargin(5);
layout->setSpacing(0);
setLayout(layout);
}

// Allows you to access the content area of the frame
// where widgets and layouts can be added
QWidget *contentWidget() const { return m_content; }

void mousePressEvent(QMouseEvent *e)
{
m_old_pos = e->pos();
m_mouse_down = e->button() == Qt::LeftButton;
}

void mouseMoveEvent(QMouseEvent *e)
{
int x = e->x();
int y = e->y();

if (m_mouse_down) {
int dx = x - m_old_pos.x();
int dy = y - m_old_pos.y();

QRect g = geometry();

if (left)
g.setLeft(g.left() + dx);
if (right)
g.setRight(g.right() + dx);
if (bottom)
g.setBottom(g.bottom() + dy);
if (top)
g.setTop(g.top() + dy);

setGeometry(g);

m_old_pos = QPoint(!left ? e->x() : m_old_pos.x(), e->y());
} else {
QRect r = rect();
top = qAbs(y - r.top()) <= 5;
left = qAbs(x - r.left()) <= 5;
right = qAbs(x - r.right()) <= 5;
bottom = qAbs(y - r.bottom()) <= 5;
bool hor = left | right;

if (hor && bottom) {
if (left)
setCursor(Qt::SizeBDiagCursor);
else
setCursor(Qt::SizeFDiagCursor);
} else if (hor) {
setCursor(Qt::SizeHorCursor);
} else if (bottom || top) {
setCursor(Qt::SizeVerCursor);
} else {
setCursor(Qt::ArrowCursor);
}
}
}

void mouseReleaseEvent(QMouseEvent *e)
{
m_mouse_down = false;
}

private:
QWidget *m_content;
QPoint m_old_pos;
bool m_mouse_down;
bool left, right, bottom, top;
};

#include "main.moc"

int main(int argc, char **argv)
{
QApplication app(argc, argv);

Frame box;

QVBoxLayout *l = new QVBoxLayout(box.contentWidget());
l->setMargin(0);
QTextEdit *edit = new QTextEdit(box.contentWidget());
l->addWidget(edit);

box.show();
return app.exec();
}

ответил(а) 2017-09-27T13:20:00+03:00 2 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема