【问题标题】:Why does the border of QWidget cover the contents?QWidget的边框为什么会覆盖内容?
【发布时间】:2019-03-12 20:43:37
【问题描述】:

我有一个从QWidget 派生的自定义小部件,它有一个minimumSize(30, 30) 和一个QLabel 作为childWidget

MyWidget::MyWidget (QWidget *parent, QPoint p,
                  QWidget *childWidget) : QWidget (parent)
{
    childWidget = this->childWidget;
    setAttribute (Qt::WA_DeleteOnClose);
    this->move (p);
    verticalLayout = new QVBoxLayout (this);

    if (childWidget != NULL)
    {
        childWidget->setParent (this);
        childWidget->releaseMouse();
        childWidget->setAttribute (Qt::WA_TransparentForMouseEvents,     true);
        verticalLayout->addWidget (childWidget);
    }
    this->setLayout(verticalLayout);
};

MyWidget::mouseMoveEvent (QMouseEvent *e)
{
    if (! (e->button() == Qt::RightButton))
    {
        this->update();
        this->raise();
    }
}

void MyWidget::mouseReleaseEvent (QMouseEvent *evt)
{
    QWidget::mouseReleaseEvent(evt);
    this->update();
}

MyWidget::mousePressEvent (QMouseEvent *e)
{
    if (! (e->button() == Qt::RightButton))
    {

        this->update();
        this->raise();
    }
}

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::darkGreen);
    painter.drawRect(1, 2, 6, 4);
    painter.setPen(Qt::darkGray);
    painter.drawLine(2, 8, 6, 2);
}

//And some getter/setter methods.

为了给小部件设置边框,我使用以下代码:

 customWidget->setStyleSheet("*{border-width:" +
    2 +
    ";border-style:solid;border-color:" +
    #FFFFFF + " ;color:white;}");

看起来像这样(父小部件有橙色背景):

.

当我把border-width改成10时,边框覆盖了内容:

两张图片都显示了小部件的最小高度。

在我看来,边框好像是向内应用的。我应该修改什么以将边框指向外部,以便更大的border-width 文本仍然可见?

【问题讨论】:

  • 通过使用QWidget::setMinimumSize 将其最小尺寸设置为适当的值来防止小部件缩小。
  • 我的自定义小部件已经有一个 MinimumHeight 和 MinimumWidth。上面的图片(1 和 2)是在它的 MinimumHeight 中的小部件。但是对于这个高度,当我将边框宽度设置为 10 时,它就像pic2。无论如何我可以让边界向外延伸吗??
  • 请看一下编辑:我已经更新了构造函数
  • 我会尽快更新可复制代码!!
  • 哦..现在我明白了实际问题。我会接受它作为答案。你能添加这个吗。

标签: css qwidget qtstylesheets border-color qt5.9


【解决方案1】:

原因

边框确实向外:

您的尺寸有问题。 (30, 30) 对于这个边框来说太小了。 30 - 2*10(最小高度 - 边框宽度的 2 倍)等于 10。您的字体大于 10 像素,因此它不适合剩余空间。

解决方案

您可能想设置一个合理的大小,例如(100, 50)。但是,设置最小尺寸并不灵活,这意味着它不考虑小部件内容的变化。但是,如果实现了sizeHintminimumSizeHint,则会在需要时报告必要的空间,例如在QLabel 中所做的那样。

由于您已经有一个QLabel 作为子窗口小部件,只需避免设置自定义窗口小部件的minimumSize,就会自动计算正确的大小。

【讨论】:

  • 我想要一个 sizehint 的自定义实现,就像你分享的那样,但我是 qt 新手,我无法理解它;你能分享一些教程或书籍,以便我理解并自行实施!
  • @adi,size hint is the preferred size of the widget, layouts will try to keep it as close to this as possible.。基本上你必须返回一个QSize,这是你根据小部件空间要求计算的,例如边框宽度、边距、填充和内容。如果您发布带有特定示例内容的新问题,我将尝试为您实现sizeHint
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2021-09-09
  • 1970-01-01
  • 2011-02-13
  • 2016-11-14
  • 1970-01-01
  • 2021-06-07
相关资源
最近更新 更多