我使用Qt Creator制作了一个应用程序。由于我希望它看起来与普通的Windows应用程序不同,因此我删除了Windows标题栏。但是,如果没有标题栏,我无法移动,最小化和最大化应用程序。如果可能的话,我希望通过按住菜单栏移动我的应用程序,并在菜单栏的右上角放置OS X应用程序中使用的那三个彩色圆形按钮。这在Qt中可行吗?
答案 0 :(得分:0)
我将解释如何获得它的结构,但我会留给你设计所有内容并连接信号。
最好的办法是创建自己的QWidget
类,类似于' TitleBar'并给它一个QHBoxLayout
。在TitleBar'类,创建另一个QWidget
和QHBoxLayout
以包含按钮。创建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