【问题标题】:Promote QWidget to QMainWindow or add QMainWindow to QWidget from Qt Designer将 QWidget 提升为 QMainWindow 或从 Qt Designer 将 QMainWindow 添加到 QWidget
【发布时间】:2014-10-24 09:48:54
【问题描述】:

我的问题:

我想自定义 title bar 的工作方式和查找我的应用程序的方式。

我的想法:

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

这使外部小部件透明并为我的内部小部件添加阴影。从这里开始,我可以创建一个自定义标题栏小部件,我可以随意实现它。

这是结果:

我的问题

我想让这个设计器可以用作主窗口,QWidget 不允许我添加 FROM THE DESIGNER tool barsmenu barstatus bar

我想到的是添加一个 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);

这是结果:

我的问题:

我怎样才能从Qt Designer 获得这个结果?是否可以将QWidget 提升为QMainWindow?我想不出另一种方法......对我来说,让它可以从Qt Designer 使用真的很重要,因为我打算把它变成一个模板小部件并能够创建例如一个新的QCustomMainWindow 表单Qt Creator 就像你可以创建一个QWidget 或一个QMainWindow

请帮忙!

【问题讨论】:

  • QMainWindow 开头,然后对其应用适当的标志。 QMainWindow 是QWidget 的子类。如果不能在设计器中轻松完成,那么在代码中完成是相当轻松的。在 ui->setup() 调用之后立即在构造函数中执行此操作。
  • @phyatt 你能在apply the appropriate flags 部分更具体吗?如您所见,为了获得阴影,我需要在QWidget 上绘制QMainWindow,同时仍保留Qt Designer 功能。这是我不知道的。

标签: c++ qt qt5 qwidget qmainwindow


【解决方案1】:

这是另一个与您类似的 SO 问题:Qt4: Placing QMainWindow instance inside other QWidget/QMainWindow

只是添加到我原来的评论:

QMainWindow 开头,然后对其应用适当的标志。 QMainWindowQWidget 的子类。如果不能在设计器中轻松完成,那么在代码中完成是相当轻松的。在 ui->setup() 调用之后立即在构造函数中执行此操作。

从 QMainWindow 开始

自定义窗口标志

所以在 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

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多