summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/accessible/qaccessiblewidgets.cpp28
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp2
-rw-r--r--src/widgets/effects/qpixmapfilter.cpp45
-rw-r--r--src/widgets/kernel/qgridlayout.cpp2
-rw-r--r--src/widgets/kernel/qwidget.cpp7
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp2
-rw-r--r--src/widgets/styles/qfusionstyle.cpp10
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm5
-rw-r--r--src/widgets/widgets/qsplashscreen.cpp5
9 files changed, 44 insertions, 62 deletions
diff --git a/src/widgets/accessible/qaccessiblewidgets.cpp b/src/widgets/accessible/qaccessiblewidgets.cpp
index 3f12ae6f0d..7080dd6f8d 100644
--- a/src/widgets/accessible/qaccessiblewidgets.cpp
+++ b/src/widgets/accessible/qaccessiblewidgets.cpp
@@ -727,19 +727,31 @@ QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *end
int blockEnd = blockStart + block.length();
QTextBlock::iterator iter = block.begin();
- while (!iter.fragment().contains(offset))
+ int lastFragmentIndex = blockStart;
+ while (!iter.atEnd()) {
+ QTextFragment f = iter.fragment();
+ if (f.contains(offset))
+ break;
+ lastFragmentIndex = f.position() + f.length();
++iter;
+ }
- QTextFragment fragment = iter.fragment();
- int pos = fragment.position();
-
- // text block and fragment may overlap, use the smallest common range
- *startOffset = qMax(pos, blockStart);
+ QTextCharFormat charFormat;
+ if (!iter.atEnd()) {
+ QTextFragment fragment = iter.fragment();
+ charFormat = fragment.charFormat();
+ int pos = fragment.position();
+ // text block and fragment may overlap, use the smallest common range
+ *startOffset = qMax(pos, blockStart);
+ *endOffset = qMin(pos + fragment.length(), blockEnd);
+ } else {
+ charFormat = block.charFormat();
+ *startOffset = lastFragmentIndex;
+ *endOffset = blockEnd;
+ }
Q_ASSERT(*startOffset <= offset);
- *endOffset = qMin(pos + fragment.length(), blockEnd);
Q_ASSERT(*endOffset >= offset);
- QTextCharFormat charFormat = fragment.charFormat();
QTextBlockFormat blockFormat = cursor.blockFormat();
QMap<QByteArray, QString> attrs;
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp
index 70da6ff99b..455111225e 100644
--- a/src/widgets/dialogs/qfiledialog.cpp
+++ b/src/widgets/dialogs/qfiledialog.cpp
@@ -2711,7 +2711,7 @@ void QFileDialogPrivate::createWidgets()
return;
Q_Q(QFileDialog);
model = new QFileSystemModel(q);
- options->setFilter(model->filter());
+ model->setFilter(options->filter());
model->setObjectName(QLatin1String("qt_filesystem_model"));
if (QPlatformFileDialogHelper *helper = platformFileDialogHelper())
model->setNameFilterDisables(helper->defaultNameFilterDisables());
diff --git a/src/widgets/effects/qpixmapfilter.cpp b/src/widgets/effects/qpixmapfilter.cpp
index 580ba33421..8956794e06 100644
--- a/src/widgets/effects/qpixmapfilter.cpp
+++ b/src/widgets/effects/qpixmapfilter.cpp
@@ -416,17 +416,7 @@ void QPixmapConvolutionFilter::draw(QPainter *painter, const QPointF &p, const Q
if (src.isNull())
return;
- QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
- static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
- QPixmapConvolutionFilter *convolutionFilter = static_cast<QPixmapConvolutionFilter*>(filter);
- if (convolutionFilter) {
- convolutionFilter->setConvolutionKernel(d->convolutionKernel, d->kernelWidth, d->kernelHeight);
- convolutionFilter->d_func()->convoluteAlpha = d->convoluteAlpha;
- convolutionFilter->draw(painter, p, src, srcRect);
- return;
- }
-
- // falling back to raster implementation
+ // raster implementation
QImage *target = 0;
if (painter->paintEngine()->paintDevice()->devType() == QInternal::Image) {
@@ -925,16 +915,6 @@ void QPixmapBlurFilter::draw(QPainter *painter, const QPointF &p, const QPixmap
if (qt_scaleForTransform(painter->transform(), &scale))
scaledRadius /= scale;
- QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
- static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
- QPixmapBlurFilter *blurFilter = static_cast<QPixmapBlurFilter*>(filter);
- if (blurFilter) {
- blurFilter->setRadius(scaledRadius);
- blurFilter->setBlurHints(d->hints);
- blurFilter->draw(painter, p, src, srcRect);
- return;
- }
-
QImage srcImage;
QImage destImage;
@@ -1095,17 +1075,7 @@ void QPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const Q
if (src.isNull())
return;
- QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
- static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
- QPixmapColorizeFilter *colorizeFilter = static_cast<QPixmapColorizeFilter*>(filter);
- if (colorizeFilter) {
- colorizeFilter->setColor(d->color);
- colorizeFilter->setStrength(d->strength);
- colorizeFilter->draw(painter, dest, src, srcRect);
- return;
- }
-
- // falling back to raster implementation
+ // raster implementation
if (!d->opaque) {
painter->drawPixmap(dest, src, srcRect);
@@ -1329,17 +1299,6 @@ void QPixmapDropShadowFilter::draw(QPainter *p,
if (px.isNull())
return;
- QPixmapFilter *filter = p->paintEngine() && p->paintEngine()->isExtended() ?
- static_cast<QPaintEngineEx *>(p->paintEngine())->pixmapFilter(type(), this) : 0;
- QPixmapDropShadowFilter *dropShadowFilter = static_cast<QPixmapDropShadowFilter*>(filter);
- if (dropShadowFilter) {
- dropShadowFilter->setColor(d->color);
- dropShadowFilter->setBlurRadius(d->radius);
- dropShadowFilter->setOffset(d->offset);
- dropShadowFilter->draw(p, pos, px, src);
- return;
- }
-
QImage tmp(px.size(), QImage::Format_ARGB32_Premultiplied);
tmp.fill(0);
QPainter tmpPainter(&tmp);
diff --git a/src/widgets/kernel/qgridlayout.cpp b/src/widgets/kernel/qgridlayout.cpp
index 1beeb63a2c..0e0c1588a1 100644
--- a/src/widgets/kernel/qgridlayout.cpp
+++ b/src/widgets/kernel/qgridlayout.cpp
@@ -565,7 +565,7 @@ void QGridLayoutPrivate::add(QGridBox *box, int row1, int row2, int col1, int co
add(box, row1, col1);
return;
}
- expand(row2 + 1, col2 + 1);
+ expand(qMax(row1, row2) + 1, qMax(col1, col2) + 1);
box->row = row1;
box->col = col1;
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 73815113e4..6d896f5f50 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -5229,6 +5229,9 @@ QGraphicsEffect *QWidget::graphicsEffect() const
\note This function will apply the effect on itself and all its children.
+ \note Graphics effects are not supported for OpenGL-based widgets, such as QGLWidget,
+ QOpenGLWidget and QQuickWidget.
+
\since 4.6
\sa graphicsEffect()
@@ -12271,7 +12274,7 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const
{
#ifndef QT_NO_GRAPHICSVIEW
Q_D(const QWidget);
- if (d->extra && d->extra->proxyWidget) {
+ if (d->extra && d->extra->proxyWidget && d->extra->proxyWidget->scene()) {
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
if (!views.isEmpty()) {
const QPointF scenePos = d->extra->proxyWidget->mapToScene(pos);
@@ -12306,7 +12309,7 @@ QPoint QWidget::mapFromGlobal(const QPoint &pos) const
{
#ifndef QT_NO_GRAPHICSVIEW
Q_D(const QWidget);
- if (d->extra && d->extra->proxyWidget) {
+ if (d->extra && d->extra->proxyWidget && d->extra->proxyWidget->scene()) {
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
if (!views.isEmpty()) {
const QPoint viewPortPos = views.first()->viewport()->mapFromGlobal(pos);
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 6c7dc070d5..6b03ad0b6c 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -651,7 +651,7 @@ void QWidgetWindow::handleScreenChange()
void QWidgetWindow::repaintWindow()
{
- if (!m_widget->isVisible() || !m_widget->updatesEnabled())
+ if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
return;
QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp
index 5a137dc41d..8589b6b544 100644
--- a/src/widgets/styles/qfusionstyle.cpp
+++ b/src/widgets/styles/qfusionstyle.cpp
@@ -1737,8 +1737,8 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio
state = QIcon::On;
QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
- int w = pixmap.width();
- int h = pixmap.height();
+ int w = pixmap.width() / pixmap.devicePixelRatio();
+ int h = pixmap.height() / pixmap.devicePixelRatio();
if (!button->text.isEmpty())
w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 2;
@@ -1746,15 +1746,17 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio
point = QPoint(ir.x() + ir.width() / 2 - w / 2,
ir.y() + ir.height() / 2 - h / 2);
+ w = pixmap.width() / pixmap.devicePixelRatio();
+
if (button->direction == Qt::RightToLeft)
- point.rx() += pixmap.width();
+ point.rx() += w;
painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap);
if (button->direction == Qt::RightToLeft)
ir.translate(-point.x() - 2, 0);
else
- ir.translate(point.x() + pixmap.width(), 0);
+ ir.translate(point.x() + w, 0);
// left-align text if there is
if (!button->text.isEmpty())
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index 3973534d83..394d06843b 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -1962,6 +1962,7 @@ void QMacStylePrivate::drawColorlessButton(const HIRect &macRect, HIThemeButtonD
|| bdi->kind == kThemeComboBoxSmall
|| bdi->kind == kThemeComboBoxMini;
const bool button = opt->type == QStyleOption::SO_Button;
+ const bool viewItem = opt->type == QStyleOption::SO_ViewItem;
const bool pressed = bdi->state == kThemeStatePressed;
const bool usingYosemiteOrLater = QSysInfo::MacintoshVersion > QSysInfo::MV_10_9;
@@ -2002,6 +2003,8 @@ void QMacStylePrivate::drawColorlessButton(const HIRect &macRect, HIThemeButtonD
HIRect newRect = CGRectMake(xoff, yoff, macRect.size.width, macRect.size.height);
if (button && pressed)
bdi->state = kThemeStateActive;
+ else if (usingYosemiteOrLater && viewItem)
+ bdi->state = kThemeStateInactive;
HIThemeDrawButton(&newRect, bdi, cg, kHIThemeOrientationNormal, 0);
}
}
@@ -2049,7 +2052,7 @@ void QMacStylePrivate::drawColorlessButton(const HIRect &macRect, HIThemeButtonD
rect.adjust(0, 0, -5, 0);
drawNSViewInRect(cw, bc, rect, p);
return;
- } else if (usingYosemiteOrLater && editableCombo) {
+ } else if (usingYosemiteOrLater && (editableCombo || viewItem)) {
QImage image = activePixmap.toImage();
for (int y = 0; y < height; ++y) {
diff --git a/src/widgets/widgets/qsplashscreen.cpp b/src/widgets/widgets/qsplashscreen.cpp
index 448ede5ec3..1ee69c7635 100644
--- a/src/widgets/widgets/qsplashscreen.cpp
+++ b/src/widgets/widgets/qsplashscreen.cpp
@@ -262,8 +262,11 @@ inline static bool waitForWindowExposed(QWindow *window, int timeout = 1000)
void QSplashScreen::finish(QWidget *mainWin)
{
- if (mainWin && mainWin->windowHandle())
+ if (mainWin) {
+ if (!mainWin->windowHandle())
+ mainWin->createWinId();
waitForWindowExposed(mainWin->windowHandle());
+ }
close();
}