我定制了名为" MainWidget"的QWidget。以及一个名为" ChildWidget"的定制QWidget。 MainWidget是ChildWidget的父级,这些子小部件是动态创建的,并插入到MainWidget的小部件堆栈中。
我使用样式表在各自的.ui(表单)文件中设置MainWidget和ChildWidget的背景颜色。 选择小部件 - >右键单击小部件 - >更改样式表 - >选择背景颜色 - >申请 - >保存.ui文件
" background-color:;"
每个ChidlWidget都有自己独特的大小(宽度和高度),这样当它们堆叠在MainWidget的小部件堆栈上时,可能有一个小部件重叠其他小部件的机会,一些小部件完全被遮挡而一些小部件部分可见。
我试图找到所有类型小部件的可见性状态(模糊,完全可见,部分可见)。 我正在使用以下代码段。
void MainWidget::printVisibilityState()
{
QList<ChildWidget *> childWidgetsList = findChildren<ChildWidget *>();
for (register int i = 0; i < childWidgetsList.size(); i++)
{
ChildWidget* pWidget = childWidgetsList.at(i);
QRegion visibleRegion = pWidget->visibleRegion();
QRect visibleRegionBoundingRect = visibleRegion.boundingRect();
int visibleRegionRectsCount = visibleRegion.rects().count();
QRect widgetRect = pWidget->rect();
if (visibleRegion.isEmpty()) {
qDebug() <<pWidget->getName()<< "is OBSCURED";
}
else {
if (
(visibleRegionBoundingRect == widgetRect) &&
(1 == visibleRegionRectsCount))
{
qDebug() <<pWidget->getName()<< "is VISIBLE";
}
else
{
qDebug() <<pWidget->getName()<< "is PARTIALLY VISIBLE";
}
}
}
}
我在MainWidget和ChildWidget中使用以下代码片段实现了painEvent。
void ChildWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void MainWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
此代码将所有子窗口小部件的可见性状态打印为VISIBLE。
注意:如果我对MainWidget和ChildWidget使用setAutoFillBackground(true),而不是使用样式表设置背景颜色,那么我将获得正确的可见性状态。
你能否指导我为什么在使用样式表时它没有给我正确的可见性状态? 我在计算可见性状态时遗漏了什么吗?
有没有其他方法可以获得可见性状态信息?
QWidget文档(http://qt-project.org/doc/qt-4.8/qwidget.html#visible-prop)表示,&#34;恰好被屏幕上的其他窗口遮挡的小部件被视为可见。&#34;
如果是这种情况我们如何确定部分可见小部件的可见性状态? (例如,在其他窗口上弹出错误,因此错误弹出窗口完全可见,窗口部分可见)
请帮帮我
此致
SRaju