从Qt Designer将QWidget升级为QMainWindow,或将QMainWindow添加到QWidget中。

5

我的问题:

我想要自定义标题栏在我的应用程序中的工作和外观。

我的想法:

我在Qt Designer中创建了一个新的QWidget表单,并添加了一个QWidget。我在构造函数中添加了以下代码:

setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint);

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(20);
effect->setXOffset(0);
effect->setYOffset(0);
setGraphicsEffect(effect);

这将使外部小部件透明,并在我的内部小部件上添加阴影。从此,我可以创建自定义标题栏小部件,然后按照自己的想法实现它。

这是结果:

enter image description here

我的问题

我希望将其作为主窗口从设计师中使用,但 QWidget 不允许我添加来自设计师的 工具栏菜单栏状态栏

我考虑的是将 QMainWindow 小部件作为外部 QWidget 的子小部件(它是透明的并作为我的阴影支撑(阴影绘制在上面))。我成功地做到了这一点,但只能通过代码实现:

QMainWindow *centralwidget = new QMainWindow();
centralwidget->setStyleSheet("background-color: lightgray;");
centralwidget->setGeometry(0, 0, 50, 20);
centralwidget->setWindowFlags(Qt::Widget);
this->layout()->addWidget(centralwidget);

QMenuBar *menuBar = new QMenuBar(centralwidget);
menuBar->addAction("Action");

QStatusBar *statusBar = new QStatusBar;
statusBar->showMessage("Status bar here");

centralwidget->addToolBar("tool bar");
centralwidget->setMenuBar(menuBar);
centralwidget->setStatusBar(statusBar);

这是结果: enter image description here 我的问题是:
如何从Qt Designer实现这个结果?能否将QWidget提升为QMainWindow?我想不到其他的方法...让它可以在Qt Designer中可用对我来说非常重要,因为我打算将其创建为模板小部件,并能够像创建QWidget或QMainWindow一样从Qt Creator中创建一个新的QCustomMainWindow表单。
请帮忙!

2
QMainWindow 开始,然后对其应用适当的标志。 QMainWindow 是 QWidget 的子类。如果在设计师中不能轻松完成,则在代码中执行起来非常简单。在 ui->setup() 调用之后,在构造函数中执行此操作。 - phyatt
@phyatt,在“应用适当的标志”部分,您能否更具体一些?正如您所看到的,为了拥有阴影效果,我需要将“QMainWindow”绘制在“QWidget”的顶部,同时仍然保持“Qt Designer”功能不变。这就是我不知道的地方。 - Jacob Krieg
1个回答

3
这里有一个与你问题类似的SO问题:Qt4:将QMainWindow实例放置在其他QWidget / QMainWindow中 在我的原始评论基础上添加:
QMainWindow开始,然后应用适当的标志。 QMainWindowQWidget的子类。如果在设计师中不能轻松完成,则在ui->setup()调用后立即在构造函数中执行。

从QMainWindow开始

Project Selection Dialog

Form Selection Dialog

自定义窗口标志

因此,在mainwindow.cpp的构造函数中,您可以放置: http://qt-project.org/doc/qt-5/qt.html#WindowType-enum
this->setWindowFlags(Qt::Widget);

QWidget 为默认窗口类型。当此类型的窗口有父控件时,它们是子控件;当没有父控件时,它们是独立窗口。参见 Qt::Window 和 Qt::SubWindow。

// or if you want to apply more than one you, "or" it together, like so:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool);

试试其中几个,看看你喜欢哪些。

自定义小部件属性

还有小部件属性,它们可以对小部件的外观和行为进行强有力的控制。

http://qt-project.org/doc/qt-5/qt.html#WidgetAttribute-enum

Qt样式表

除了上述所有标志和属性外,您还可以使用样式表修改大量内容:

http://qt-project.org/doc/qt-5/stylesheet-reference.html

this->setStyleSheet("background: #000000;");

Qt Designer自定义小部件

如果你有兴趣将它变成可在Qt Designer中重复使用的组件,你可以将其制作为Qt Designer插件或自定义小部件。

http://qt-project.org/doc/qt-4.8/designer-using-custom-widgets.html

http://qt-project.org/doc/qt-4.8/designer-creating-custom-widgets.html

QMdiArea和QMdiWindow

除了使用QMainWindow之外,另一种值得考虑的路径是使用QMdiSubWindow

http://qt-project.org/doc/qt-5/QMdiSubWindow.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接