从Qt应用程序中删除标题栏

时间:2015-01-08 18:38:17

标签: c++ qt user-interface

enter image description here

我使用Qt Creator制作了一个应用程序。由于我希望它看起来与普通的Windows应用程序不同,因此我删除了Windows标题栏。但是,如果没有标题栏,我无法移动,最小化和最大化应用程序。如果可能的话,我希望通过按住菜单栏移动我的应用程序,并在菜单栏的右上角放置OS X应用程序中使用的那三个彩色圆形按钮。这在Qt中可行吗?

1 个答案:

答案 0 :(得分:0)

我将解释如何获得它的结构,但我会留给你设计所有内容并连接信号。

最好的办法是创建自己的QWidget类,类似于' TitleBar'并给它一个QHBoxLayout。在TitleBar'类,创建另一个QWidgetQHBoxLayout以包含按钮。创建3 QPushButtons并将其添加到其中。接下来,您需要创建自己的QMenuBar类,类似于' MenuBar'这样你就可以获得鼠标事件并构建拖动机制。下面是一些如何实现此目的的示例代码。

TitleBar中

TitleBar::TitleBar() :
    QWidget()
{

    QHBoxLayout *l = new QHBoxLayout();
    l->setContentsMargins(0, 0, 0, 0);
    setLayout(l);

    QWidget *buttonGroup = new QWidget();
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->setContentsMargins(0, 0, 0, 0);

    QPushButton *minButton = new QPushButton("");
    QPushButton *maxButton = new QPushButton("");
    QPushButton *closeButton = new QPushButton("");

    buttonLayout->addWidget(minButton, Qt::AlignRight);
    buttonLayout->addWidget(maxButton, Qt::AlignRight);
    buttonLayout->addWidget(closeButton, Qt::AlignRight);

    buttonGroup->setLayout(buttonLayout);
    buttonGroup->setFixedSize(buttonGroup->sizeHint());

    MenuBar *bar = new MenuBar();
    bar->addMenu("&File");

    l->addWidget(bar);
    l->addWidget(buttonGroup);

}

的MenuBar

void MenuBar::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
        QPointF newPos = (event->localPos() - dragPos) + window()->pos();
        window()->move(newPos.x(), newPos.y());
    }
    else
        QMenuBar::mouseMoveEvent(event);
}

void MenuBar::mousePressEvent(QMouseEvent *event)
{
    dragPos = event->localPos();
    QMenuBar::mousePressEvent(event);
}

然后,您只需添加' TitleBar'通过顶部对齐将您的小部件的主要布局分类,您将一切顺利!现在这并不完美,但我认为它完成了工作。

以下是使用此方法的示例项目:http://www.filedropper.com/menubartest