これを実行する最も良い方法は、マウスの移動イベントをキャッチし、現在の場所に適したカーソルを表示し、ボタンを押したままサイズを変更することです。独自のコンテンツを入れることができる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();
}