Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Qt应用程序中删除标题栏_C++_Qt_User Interface - Fatal编程技术网

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

C++ 从Qt应用程序中删除标题栏,c++,qt,user-interface,C++,Qt,User Interface,我使用Qt Creator制作了一个应用程序。因为我想让它看起来不同于普通的Windows应用程序,所以我删除了Windows标题栏。但是,没有标题栏,我无法移动、最小化和最大化应用程序。如果可能的话,我希望通过按住菜单栏移动我的应用程序,并将OSX应用程序中使用的三个彩色圆形按钮放在菜单栏的右上角。这在Qt中可行吗?我将解释如何获得它的结构,但我将把它留给您来设计所有内容并连接信号 最好的办法是创建自己的QWidget类,称为“TitleBar”,并为其提供QHBoxLayout。在“Titl

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

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

最好的办法是创建自己的QWidget类,称为“TitleBar”,并为其提供QHBoxLayout。在“TitleBar”类中,创建另一个QWidget和QHBoxLayout以包含按钮。创建3个QpushButton并将其添加到其中。接下来,您需要创建自己的QMenuBar类,称为“MenuBar”,这样您就可以获取鼠标事件并构建拖动机制。下面是一些示例代码,说明了如何实现这一点

标题栏

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);

}
梅努巴

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”类添加到具有顶部对齐的小部件的主布局中,就可以了!这并不完美,但我认为它完成了任务


下面是一个使用此方法的示例项目:

可能的重复我不认为这是重复的。这个问题是针对Mac的,这个问题是针对Windows的。@user3734823,你说的是Windows,Windows还是Windows的?我希望我没有编辑错。如果是这样的话,你可能想在标题中添加Windows。是的,在Qt中任何事情都是可行的。您需要在窗口上调用setWindowFlagsQt::FramelessWindowHint以删除标题栏,然后实现您自己的标题栏小部件,您需要在其上添加QMenuBar,并将其放置在标题栏的自然位置。当然,您必须实现所有鼠标事件、按钮最小化/最大化/关闭以及自己的风格。你还将失去空气动力学效果和阴影,如果你想要的话,你也需要自己实现它们…我按照你的建议尝试了,但不断得到这个错误消息,语法错误:mssing;顺便说一句,在标识符QtCoreModuleOh之前,我使用升级方法添加自定义小部件,并在titlebar.h中包含自定义菜单栏类。这可能是问题的原因吗?我不确定。我在回答中发布了一个使用此方法的示例项目。只需将menubar和titlebar类复制到您的项目中。有没有办法不使用localpos?因为我的QT版本不支持localpos,但GlobalPos只支持pos。你应该认真考虑升级到QT5