- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在标题栏中创建一个带有透明 QToolBar 的应用程序。这适用于通过使用一些 Objective-C 对窗口本身进行一些修改。还有 setUnifiedTitleAndToolBarOnMac()
它看起来就像我想要的一样。现在有一个问题。我想稍后添加一个 QGridLayout 。就像在 iPadOS 上的新照片应用程序中一样,我希望小部件位于工具栏后面。透明样式可能可以通过设置 QToolBar 的样式来实现(但这是我可以解决的问题)。我现在的问题是,有没有可能重叠两个小部件或在任何其他小部件后面发送小部件的方法?我也可以使用 QVBoxLayout,但我不知道如何在任何其他小部件(或布局)后面设置一些小部件。
我试图实现的目标如下:
我目前的做法是这样的:
我听说了stackUnder()
但这不起作用。
我希望我的问题很清楚,这是我第一次在这里发帖。
谢谢!
编辑:
QToolBar *tabBar = new QToolBar(this);
tabBar->setMovable(false);
tabBar->setFloatable(false);
addToolBar(tabBar);
this->setUnifiedTitleAndToolBarOnMac(true);
QPushButton *tabBtn = new QPushButton("Test", this); // simulates our iPadOS tab control
QWidget *spaceLeft = new QWidget(this);
QWidget *spaceRight = new QWidget(this);
spaceLeft->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
spaceRight->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
tabBar->addWidget(spaceLeft);
tabBar->addWidget(tabBtn);
tabBar->addWidget(spaceRight);
ui->toggleMin->stackUnder(tabBar);
最佳答案
这是一个有点通用的容器示例QWidget
管理覆盖 QWidget
,在这种情况下是工具栏样式的小部件(但它实际上可以是任何东西)。对于一个简单的示例,代码有点冗长,但它试图涵盖一些不同的用例以使容器更加灵活。覆盖小部件可以是 QToolBar
,但不是必须的。
这里的主要技术是覆盖小部件不在布局中定位,而是由父小部件“手动”管理其几何形状(参见代码中的positionToolbar()
)。每当容器或叠加层的大小发生变化时,都需要重新调整此几何形状。最方便的“钩子(Hook)”是QWidget::resizeEvent()
我们在示例中重新实现的方法。我们还监视覆盖小部件的大小变化,例如。当添加/删除子项或修改其样式时。
另一个方向可能是编写自定义 QLayout
基本上做同样事情的子类(在 QLayoutItem::setGeometry()
中覆盖)。它会涉及更多,但也更灵活,因为它可以用于任何小部件或作为子布局。
更新:我已经创建了这样一个布局管理器,它被称为 OverlayStackLayout (docs)。也是一个简单但实用的image viewer example应用程序,灵感来自这个简短的。
工具栏OverlayWidget.h
#include <QEvent>
#include <QPointer>
#include <QToolBar>
#include <QWidget>
class ToolbarOverlayWidget : public QWidget
{
Q_OBJECT
public:
ToolbarOverlayWidget(QWidget *parent = nullptr) :
QWidget(parent)
{
// WA_LayoutOnEntireRect will ensure that any QLayout set on this widget will
// ignore QWidget::contentsMargins(), which allows us to use them for toolbar
// margins/positioning instead. This does not affect any layout()->contentsMargins()
// which can still be used to pad anything the main layout itself contains.
setAttribute(Qt::WA_LayoutOnEntireRect);
// create a default toolbar
setToolbar(new QToolBar(this));
}
~ToolbarOverlayWidget() override
{
// don't delete the toolbar widget if we don't own it
if (m_toolbar && !m_ownTbWidget)
m_toolbar->setParent(nullptr);
}
// Returns toolbar widget instance as a QToolBar.
// Returns nullptr if no toolbar widget is set, or widget does not inherit QToolBar.
QToolBar *toolbar() const { return qobject_cast<QToolBar*>(m_toolbar.data()); }
// Set a widget to be used as a toolbar. ToolbarOverlayWidget takes ownership of toolbar.
void setToolbar(QWidget *toolbar)
{
// dispose of old toolbar?
if (m_toolbar) {
m_toolbar->removeEventFilter(this);
m_toolbar->disconnect(this);
if (m_ownTbWidget)
m_toolbar->deleteLater();
else
m_toolbar->setParent(nullptr);
m_toolbar.clear();
}
if (!toolbar)
return;
m_toolbar = toolbar;
// toolbar's parent should be this widget, also keep track of if we owned it originally
m_ownTbWidget = (m_toolbar->parent() == this);
if (!m_ownTbWidget)
m_toolbar->setParent(this);
m_toolbar->setAutoFillBackground(true); // ensure a background if otherwise unstyled
m_toolbar->installEventFilter(this); // see eventFilter()
if (QToolBar *tb = qobject_cast<QToolBar*>(toolbar)) {
// reposition toolbar if icon size or button style change
connect(tb, &QToolBar::iconSizeChanged, this, [this](const QSize &) {
positionToolbar(); });
connect(tb, &QToolBar::toolButtonStyleChanged, this, [this](Qt::ToolButtonStyle) {
positionToolbar(); });
}
if (isVisible())
positionToolbar();
}
QSize sizeHint() const override
{
if (m_toolbar.isNull())
return QWidget::sizeHint();
// ensure a reasonable size hint if we have a toolbar which is larger than any contents
return QWidget::sizeHint().expandedTo(m_toolbar->sizeHint());
}
protected:
void resizeEvent(QResizeEvent *e) override
{
QWidget::resizeEvent(e);
// keep the toolbar properly positioned
positionToolbar();
}
// filter is installed on the toolbar widget
bool eventFilter(QObject *w, QEvent *e) override
{
if (!m_toolbar.isNull() && w == m_toolbar) {
switch (e->type()) {
// reposition the toolbar if its size hint (possibly) changed
case QEvent::ChildAdded:
case QEvent::ChildRemoved:
case QEvent::StyleChange:
case QEvent::FontChange:
if (isVisible())
positionToolbar();
break;
default:
break;
}
}
return QWidget::eventFilter(w, e);
}
private slots:
// Keep the toolbar properly positioned and sized
void positionToolbar() const
{
if (m_toolbar.isNull())
return;
const QRect rect = contentsRect(); // available geometry for toolbar
QRect tbRect(rect.topLeft(), m_toolbar->sizeHint()); // default TB position and size
// expand to full width?
if (m_toolbar->sizePolicy().expandingDirections() & Qt::Horizontal)
tbRect.setWidth(rect.width());
// constrain width if it is too wide to fit
else if (tbRect.width() > rect.width())
tbRect.setWidth(rect.width());
// otherwise center the toolbar if it is narrower than available width
else if (tbRect.width() < rect.width())
tbRect.moveLeft(rect.x() + (rect.width() - tbRect.width()) / 2);
// constrain height
if (tbRect.height() > rect.height())
tbRect.setHeight(rect.height());
// Set position and size of the toolbar.
m_toolbar->setGeometry(tbRect);
// Make sure the toolbar stacks on top
m_toolbar->raise();
}
private:
QPointer<QWidget> m_toolbar;
bool m_ownTbWidget = true;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Use a stack widget as top-level for demo. This will have two pages.
QStackedWidget stack;
stack.resize(640, 480);
// common style for tool buttons
const QString commonCss(QStringLiteral(
"QToolButton {"
" font: bold normal 14px sans-serif;"
" color: #62777F;"
" background: transparent;"
" border-radius: 12px;"
" padding: 3px 6px 4px;"
"}"
"QToolButton:checked, QToolButton:hover {"
" color: #D5F2E5;"
" background-color: #62777F;"
"}"
"QToolButton:pressed { background-color: #72AF95; }"
));
// creates a new ToolbarOverlayWidget holding one scalable image label
auto imageWidget = [&stack](const QString &img) {
ToolbarOverlayWidget *w = new ToolbarOverlayWidget(&stack);
w->setLayout(new QVBoxLayout);
w->layout()->setContentsMargins(0,0,0,0);
QLabel *lbl = new QLabel(w);
lbl->setPixmap(QPixmap(img));
lbl->setScaledContents(true);
lbl->setMinimumSize(160, 120);
w->layout()->addWidget(lbl);
return w;
};
// Page 1: The first stack page uses a default QToolBar, which is simpler but less flexible.
{
ToolbarOverlayWidget *widget = imageWidget("../../images/image1.jpg");
// Set toolbar appearance
widget->setContentsMargins(0, 10, 0, 0); // 10px above toolbar, works better than CSS margin
widget->toolbar()->setStyleSheet(commonCss + QLatin1String(
"QToolBar {"
" background: #B5CAC1;"
" border-radius: 14px;"
" padding: 4px;" // can only set one padding for all sides of a qtoolbar
" spacing: 12px;" // between items
"}"
"QToolBar::separator { width: 1px; background-color: #72AF95; }"
));
// Add items to toolbar
QActionGroup *viewGrp = new QActionGroup(widget);
auto addViewAction = [viewGrp, widget](const QString &ttl, bool chk = false) {
QAction *act = widget->toolbar()->addAction(ttl);
act->setCheckable(true);
act->setChecked(chk);
viewGrp->addAction(act);
return act;
};
addViewAction("Years");
addViewAction("Months");
addViewAction("Days");
addViewAction("All Photos", true);
widget->toolbar()->addSeparator();
// page stack "push" action
QObject::connect(widget->toolbar()->addAction("view >"), &QAction::triggered, [&stack]() {
stack.setCurrentIndex(1);
});
stack.addWidget(widget);
}
// Page 2: This page uses a plain widget for a toolbar.
{
ToolbarOverlayWidget *widget = imageWidget("../../images/image1.jpg");
// Create a custom toolbar-style widget
QWidget *toolbar = new QWidget(widget);
toolbar->setLayout(new QHBoxLayout);
toolbar->layout()->setContentsMargins(3, 14, 3, 28);
toolbar->layout()->setSpacing(18);
toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
toolbar->setObjectName("ToolbarWidget");
toolbar->setStyleSheet(commonCss + QLatin1String(
"#ToolbarWidget {"
" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop: 0 black, stop: 1 transparent);"
"}"
"QToolButton {"
" color: #D5F2E5;"
" background-color: #62777F;"
"}"
"QToolButton:checked, QToolButton:hover:!pressed {"
" color: #62777F;"
" background-color: #D5F2E5;"
"}"
));
// Add items to toolbar
auto addButton = [toolbar](const QString &ttl, QLayout *lo, bool chk = false) {
QToolButton *tb = new QToolButton(toolbar);
tb->setText(ttl);
tb->setCheckable(chk);
lo->addWidget(tb);
return tb;
};
// left expander to keep buttons centered
toolbar->layout()->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
// page stack "pop" action
QObject::connect(addButton("< back", toolbar->layout()), &QToolButton::clicked, [&stack]() {
stack.setCurrentIndex(0);
});
addButton("Adjust", toolbar->layout());
addButton("Select", toolbar->layout(), true);
// zoom buttons, new sub-layout w/out spacing
QHBoxLayout *zoomBtnLayout = new QHBoxLayout;
zoomBtnLayout->setSpacing(0);
const QString zoomCss =
QStringLiteral("QToolButton { border-top-%1-radius: 0; border-bottom-%1-radius: 0; }");
addButton("-", zoomBtnLayout)->setStyleSheet(zoomCss.arg("right"));
addButton("+", zoomBtnLayout)->setStyleSheet(zoomCss.arg("left"));
toolbar->layout()->addItem(zoomBtnLayout);
// right expander to keep buttons centered
toolbar->layout()->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
// Use the custom widget as toolbar
widget->setToolbar(toolbar);
stack.addWidget(widget);
}
stack.show();
return a.exec();
}
#include "main.moc"
关于c++ - 在 QToolBar 后面显示 QWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160543/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!