【问题标题】:QML StatusBar with SizeGrip带有 SizeGrip 的 QML 状态栏
【发布时间】:2016-03-30 05:52:47
【问题描述】:

我注意到 QML 的 StatusBar 类型不像 QStatusBar 那样包含 SizeGrip。

为了获得尺寸控制,我不得不将 QML 嵌入到带有 QStatusBar 的 QMainWindow 中。虽然这可行,但它会使应用程序的其余部分复杂化,而且这并不是我真正想要的设计。

是否可以通过子类化直接在 QML 中实现 QStatusBar?QML 如何识别/使用 SizeGrip?

编辑: 我试图派生 QQuickPaintedItem 以尝试在 QML 中呈现 QStatusBar,但到目前为止还没有任何运气。渲染调用中触发错误:QCoreApplication::sendEvent 中的 ASSERT 失败:“无法将事件发送到不同线程拥有的对象。当前线程 399d3d8。接收器''(类型为'QStatusBar')是在线程 8c9f00 中创建的” ,文件 kernel\qcoreapplication.cpp,第 553 行

.h

class WindowStatusBar : public QQuickPaintedItem
{
    Q_OBJECT
public:
    explicit WindowStatusBar(QQuickItem *parent = 0);
    virtual ~WindowStatusBar();

    void paint(QPainter *painter);

protected:
    QStatusBar *statusBar_;
};

.cpp

WindowStatusBar::WindowStatusBar(QQuickItem *parent)
    : QQuickPaintedItem(parent)
    , statusBar_(NULL)
{
    setOpaquePainting(true);
    setAcceptHoverEvents(true);
    setAcceptedMouseButtons(Qt::AllButtons);

    statusBar_ = new QStatusBar;
}

WindowStatusBar::~WindowStatusBar()
{
    delete statusBar_;
}

void WindowStatusBar::paint(QPainter *painter)
{
    statusBar_->render(painter, QPoint(), QRegion(),
        QStatusBar::DrawWindowBackground | QStatusBar::DrawChildren);
}

【问题讨论】:

    标签: qt qml statusbar qstatusbar


    【解决方案1】:

    是的,您可以从 StatusBar 派生您自己的状态栏 QML 类型,也可以将标准 QML StatusBar 与您设计的 contentItem 一起使用。要实现尺寸控制,您可以在右边界放置一个 MouseArea - 在 onPositionChanged 中,您将发出一个信号,该信号由主窗口解释为调整大小命令。避免反馈循环(因为调整主窗口的大小可能会改变 MouseArea 中的位置)留给读者作为练习。

    【讨论】:

    • 我已经用我当前创建 QML QStatusBar 的尝试更新了这个问题。这主要是我关注的路径,因为我发现在窗口中使用 MouseArea 而不是 QSizeGrip 调整窗口的大小几乎没有那么平滑。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2014-02-08
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多