Qt在MacOSX上调整无框小部件的大小

时间:2017-07-19 10:49:03

标签: macos qt resize widget borderless

我需要在Qt中创建一个无框架小部件,它需要可调整大小。该应用程序将在Windows和Mac OSX下运行。

如果我使用:setWindowFlags(Qt::FramelessWindowHint); 我可以从右下角调整窗口的大小(QSizeGrip出现,我猜它包含在QMainWindow小部件中)。

我可以在每个角落添加夹点,但我希望窗口可以从侧面(而不仅仅是角落)调整大小。有没有什么简单的方法可以让它像普通窗口一样从各方面调整大小?

Windows有一种解决方法,它包含覆盖nativeEvent处理程序:Qt/Windows, resizable frameless window,但我无法找到适用于Mac OSX平台的解决方案。

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是捕获鼠标移动事件并显示适合您所在位置的光标,并在按住按钮时执行调整大小。有一个示例提供了一个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();
    }