C++ 从Qt应用程序中删除标题栏
我使用Qt Creator制作了一个应用程序。因为我想让它看起来不同于普通的Windows应用程序,所以我删除了Windows标题栏。但是,没有标题栏,我无法移动、最小化和最大化应用程序。如果可能的话,我希望通过按住菜单栏移动我的应用程序,并将OSX应用程序中使用的三个彩色圆形按钮放在菜单栏的右上角。这在Qt中可行吗?我将解释如何获得它的结构,但我将把它留给您来设计所有内容并连接信号 最好的办法是创建自己的QWidget类,称为“TitleBar”,并为其提供QHBoxLayout。在“TitleBar”类中,创建另一个QWidget和QHBoxLayout以包含按钮。创建3个QpushButton并将其添加到其中。接下来,您需要创建自己的QMenuBar类,称为“MenuBar”,这样您就可以获取鼠标事件并构建拖动机制。下面是一些示例代码,说明了如何实现这一点 标题栏C++ 从Qt应用程序中删除标题栏,c++,qt,user-interface,C++,Qt,User Interface,我使用Qt Creator制作了一个应用程序。因为我想让它看起来不同于普通的Windows应用程序,所以我删除了Windows标题栏。但是,没有标题栏,我无法移动、最小化和最大化应用程序。如果可能的话,我希望通过按住菜单栏移动我的应用程序,并将OSX应用程序中使用的三个彩色圆形按钮放在菜单栏的右上角。这在Qt中可行吗?我将解释如何获得它的结构,但我将把它留给您来设计所有内容并连接信号 最好的办法是创建自己的QWidget类,称为“TitleBar”,并为其提供QHBoxLayout。在“Titl
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