diff options
Diffstat (limited to 'src/widgets')
26 files changed, 172 insertions, 110 deletions
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 94cf58ae3b..d5f7449e57 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -148,6 +148,8 @@ QString qt_accHotKey(const QString &text) int ampIndex = qt_accAmpIndex(text); if (ampIndex != -1) return QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + text.at(ampIndex + 1); +#else + Q_UNUSED(text) #endif return QString(); diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index a53e5eaf30..aa075cad1b 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -327,9 +327,8 @@ int QAccessibleToolButton::childCount() const QAccessible::Role QAccessibleToolButton::role() const { - QAbstractButton *ab = button(); - #ifndef QT_NO_MENU + QAbstractButton *ab = button(); QToolButton *tb = qobject_cast<QToolButton*>(ab); if (!tb->menu()) return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton; @@ -347,6 +346,8 @@ QAccessibleInterface *QAccessibleToolButton::child(int index) const { return QAccessible::queryAccessibleInterface(toolButton()->menu()); } +#else + Q_UNUSED(index) #endif return 0; } diff --git a/src/widgets/configure.json b/src/widgets/configure.json index b1a301c7d0..f19188e584 100644 --- a/src/widgets/configure.json +++ b/src/widgets/configure.json @@ -87,7 +87,7 @@ "label": "The Model/View Framework", "purpose": "Provides the model/view architecture managing the relationship between data and the way it is presented to the user.", "section": "ItemViews", - "condition": "features.itemmodel && features.rubberband && features.scrollarea", + "condition": "features.itemmodel && features.scrollarea", "output": [ "publicFeature", "feature" ] }, "treewidget": { @@ -154,7 +154,6 @@ "label": "QSplitter", "purpose": "Provides user controlled splitter widgets.", "section": "Widgets", - "condition": "features.rubberband", "output": [ "publicFeature", "feature" ] }, "widgettextcontrol": { @@ -298,7 +297,7 @@ "label": "QDockwidget", "purpose": "Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop.", "section": "Widgets", - "condition": "features.rubberband && features.mainwindow", + "condition": "features.mainwindow", "output": [ "publicFeature", "feature" ] }, "mdiarea": { diff --git a/src/widgets/dialogs/qerrormessage.cpp b/src/widgets/dialogs/qerrormessage.cpp index 8200135abe..4ec4da6e1a 100644 --- a/src/widgets/dialogs/qerrormessage.cpp +++ b/src/widgets/dialogs/qerrormessage.cpp @@ -161,32 +161,35 @@ static void deleteStaticcQErrorMessage() // post-routine static bool metFatal = false; +static QString msgType2i18nString(QtMsgType t) +{ + Q_STATIC_ASSERT(QtDebugMsg == 0); + Q_STATIC_ASSERT(QtWarningMsg == 1); + Q_STATIC_ASSERT(QtCriticalMsg == 2); + Q_STATIC_ASSERT(QtFatalMsg == 3); + Q_STATIC_ASSERT(QtInfoMsg == 4); + + // adjust the array below if any of the above fire... + + const char * const messages[] = { + QT_TRANSLATE_NOOP("QErrorMessage", "Debug Message:"), + QT_TRANSLATE_NOOP("QErrorMessage", "Warning:"), + QT_TRANSLATE_NOOP("QErrorMessage", "Critical Error:"), + QT_TRANSLATE_NOOP("QErrorMessage", "Fatal Error:"), + QT_TRANSLATE_NOOP("QErrorMessage", "Information:"), + }; + Q_ASSERT(size_t(t) < sizeof messages / sizeof *messages); + + return QCoreApplication::translate("QErrorMessage", messages[t]); +} + static void jump(QtMsgType t, const QMessageLogContext & /*context*/, const QString &m) { if (!qtMessageHandler) return; - QString rich; - - switch (t) { - case QtDebugMsg: - rich = QErrorMessage::tr("Debug Message:"); - break; - case QtWarningMsg: - rich = QErrorMessage::tr("Warning:"); - break; - case QtCriticalMsg: - rich = QErrorMessage::tr("Critical Error:"); - break; - case QtFatalMsg: - rich = QErrorMessage::tr("Fatal Error:"); - break; - case QtInfoMsg: - rich = QErrorMessage::tr("Information:"); - break; - } - rich = QString::fromLatin1("<p><b>%1</b></p>").arg(rich); - rich += Qt::convertFromPlainText(m, Qt::WhiteSpaceNormal); + QString rich = QLatin1String("<p><b>") + msgType2i18nString(t) + QLatin1String("</b></p>") + + Qt::convertFromPlainText(m, Qt::WhiteSpaceNormal); // ### work around text engine quirk if (rich.endsWith(QLatin1String("</p>"))) diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 78e304950a..98f8147236 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -3812,8 +3812,8 @@ void QFileDialogPrivate::_q_nativeEnterDirectory(const QUrl &directory) */ bool QFileDialogPrivate::itemViewKeyboardEvent(QKeyEvent *event) { - Q_Q(QFileDialog); #if QT_CONFIG(shortcut) + Q_Q(QFileDialog); if (event->matches(QKeySequence::Cancel)) { q->reject(); return true; @@ -4018,7 +4018,9 @@ void QFileDialogLineEdit::keyPressEvent(QKeyEvent *e) } #endif // QT_KEYPAD_NAVIGATION +#if QT_CONFIG(shortcut) int key = e->key(); +#endif QLineEdit::keyPressEvent(e); #if QT_CONFIG(shortcut) if (!e->matches(QKeySequence::Cancel) && key != Qt::Key_Back) diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index b665b54a9b..d5df7542b6 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -253,15 +253,15 @@ public: bool canBeNativeDialog() const Q_DECL_OVERRIDE; inline bool usingWidgets() const; - void setDirectory_sys(const QUrl &directory); - QUrl directory_sys() const; - void selectFile_sys(const QUrl &filename); - QList<QUrl> selectedFiles_sys() const; - void setFilter_sys(); - void selectMimeTypeFilter_sys(const QString &filter); - QString selectedMimeTypeFilter_sys() const; - void selectNameFilter_sys(const QString &filter); - QString selectedNameFilter_sys() const; + inline void setDirectory_sys(const QUrl &directory); + inline QUrl directory_sys() const; + inline void selectFile_sys(const QUrl &filename); + inline QList<QUrl> selectedFiles_sys() const; + inline void setFilter_sys(); + inline void selectMimeTypeFilter_sys(const QString &filter); + inline QString selectedMimeTypeFilter_sys() const; + inline void selectNameFilter_sys(const QString &filter); + inline QString selectedNameFilter_sys() const; ////////////////////////////////////////////// QScopedPointer<Ui_QFileDialog> qFileDialogUi; @@ -341,14 +341,14 @@ private: QFileDialogPrivate *d_ptr; }; -inline QModelIndex QFileDialogPrivate::mapToSource(const QModelIndex &index) const { +QModelIndex QFileDialogPrivate::mapToSource(const QModelIndex &index) const { #ifdef QT_NO_PROXYMODEL return index; #else return proxyModel ? proxyModel->mapToSource(index) : index; #endif } -inline QModelIndex QFileDialogPrivate::mapFromSource(const QModelIndex &index) const { +QModelIndex QFileDialogPrivate::mapFromSource(const QModelIndex &index) const { #ifdef QT_NO_PROXYMODEL return index; #else @@ -356,11 +356,12 @@ inline QModelIndex QFileDialogPrivate::mapFromSource(const QModelIndex &index) c #endif } -inline QString QFileDialogPrivate::rootPath() const { +QString QFileDialogPrivate::rootPath() const +{ return (model ? model->rootPath() : QStringLiteral("/")); } -inline void QFileDialogPrivate::setDirectory_sys(const QUrl &directory) +void QFileDialogPrivate::setDirectory_sys(const QUrl &directory) { QPlatformFileDialogHelper *helper = platformFileDialogHelper(); @@ -371,14 +372,14 @@ inline void QFileDialogPrivate::setDirectory_sys(const QUrl &directory) helper->setDirectory(directory); } -inline QUrl QFileDialogPrivate::directory_sys() const +QUrl QFileDialogPrivate::directory_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->directory(); return QUrl(); } -inline void QFileDialogPrivate::selectFile_sys(const QUrl &filename) +void QFileDialogPrivate::selectFile_sys(const QUrl &filename) { QPlatformFileDialogHelper *helper = platformFileDialogHelper(); @@ -389,20 +390,20 @@ inline void QFileDialogPrivate::selectFile_sys(const QUrl &filename) helper->selectFile(filename); } -inline QList<QUrl> QFileDialogPrivate::selectedFiles_sys() const +QList<QUrl> QFileDialogPrivate::selectedFiles_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->selectedFiles(); return QList<QUrl>(); } -inline void QFileDialogPrivate::setFilter_sys() +void QFileDialogPrivate::setFilter_sys() { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) helper->setFilter(); } -inline void QFileDialogPrivate::selectMimeTypeFilter_sys(const QString &filter) +void QFileDialogPrivate::selectMimeTypeFilter_sys(const QString &filter) { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) helper->selectMimeTypeFilter(filter); @@ -416,13 +417,13 @@ QString QFileDialogPrivate::selectedMimeTypeFilter_sys() const return QString(); } -inline void QFileDialogPrivate::selectNameFilter_sys(const QString &filter) +void QFileDialogPrivate::selectNameFilter_sys(const QString &filter) { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) helper->selectNameFilter(filter); } -inline QString QFileDialogPrivate::selectedNameFilter_sys() const +QString QFileDialogPrivate::selectedNameFilter_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->selectedNameFilter(); diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp index fe32611ed8..7a98fae99c 100644 --- a/src/widgets/dialogs/qmessagebox.cpp +++ b/src/widgets/dialogs/qmessagebox.cpp @@ -1404,8 +1404,8 @@ void QMessageBox::changeEvent(QEvent *ev) */ void QMessageBox::keyPressEvent(QKeyEvent *e) { - Q_D(QMessageBox); #if QT_CONFIG(shortcut) + Q_D(QMessageBox); if (e->matches(QKeySequence::Cancel)) { if (d->detectedEscapeButton) { #ifdef Q_OS_MAC diff --git a/src/widgets/doc/images/tableWidget-stylesheet.png b/src/widgets/doc/images/tableWidget-stylesheet.png Binary files differindex e99e7a97c8..8c0669838c 100644 --- a/src/widgets/doc/images/tableWidget-stylesheet.png +++ b/src/widgets/doc/images/tableWidget-stylesheet.png diff --git a/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc b/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc index afe38b24e9..dfea9f2ca4 100644 --- a/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc +++ b/src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc @@ -1883,3 +1883,9 @@ QTabBar::close-button:hover { * { lineedit-password-mask-delay: 1000 } //! [160] +//! [161] +QTableView::indicator:unchecked { + background-color: #d7d6d5 +} +//! [161] + diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc index 607ea84c9b..0131ae18e5 100644 --- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc +++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc @@ -3909,6 +3909,12 @@ \snippet code/doc_src_stylesheet.qdoc 150 + The QTableView's checkbox indicator can also be customized. In the + following snippet the indicator \c background-color in unchecked state is + customized: + + \snippet code/doc_src_stylesheet.qdoc 161 + \section2 Customizing QToolBar The background and the handle of a QToolBar is customized as below: diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index f63e258e8e..f7c170f0bb 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -547,6 +547,8 @@ bool QAbstractItemDelegatePrivate::tryFixup(QWidget *editor) return e->hasAcceptableInput(); } } +#else + Q_UNUSED(editor) #endif // QT_NO_LINEEDIT return true; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index e22be2bd39..dc75d5eee7 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -564,6 +564,10 @@ QApplication::QApplication(int &argc, char **argv, int _internal) */ void QApplicationPrivate::init() { +#if defined(Q_OS_MACOS) + QMacAutoReleasePool pool; +#endif + QGuiApplicationPrivate::init(); initResources(); diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp index 6fb36e6b49..a852d4a474 100644 --- a/src/widgets/kernel/qopenglwidget.cpp +++ b/src/widgets/kernel/qopenglwidget.cpp @@ -573,11 +573,6 @@ public: requestedFormat = QSurfaceFormat::defaultFormat(); } - ~QOpenGLWidgetPrivate() - { - reset(); - } - void reset(); void recreateFbo(); @@ -1000,7 +995,8 @@ QOpenGLWidget::QOpenGLWidget(QWidget *parent, Qt::WindowFlags f) */ QOpenGLWidget::~QOpenGLWidget() { - makeCurrent(); + Q_D(QOpenGLWidget); + d->reset(); } /*! diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index e1158b9a16..1120958b87 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -2409,9 +2409,11 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption qreal expandOffset = -1.0; QObject *styleObject = option->styleObject; if (styleObject && proxy()->styleHint(SH_ScrollBar_Transient, option, widget)) { +#if QT_CONFIG(animation) qreal opacity = 0.0; bool shouldExpand = false; const qreal maxExpandScale = 13.0 / 9.0; +#endif int oldPos = styleObject->property("_q_stylepos").toInt(); int oldMin = styleObject->property("_q_stylemin").toInt(); @@ -2432,10 +2434,6 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption oldState != scrollBar->state || oldActiveControls != scrollBar->activeSubControls) { - // if the scrollbar is transient or its attributes, geometry or - // state has changed, the opacity is reset back to 100% opaque - opacity = 1.0; - styleObject->setProperty("_q_stylepos", scrollBar->sliderPosition); styleObject->setProperty("_q_stylemin", scrollBar->minimum); styleObject->setProperty("_q_stylemax", scrollBar->maximum); @@ -2444,6 +2442,10 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption styleObject->setProperty("_q_stylecontrols", static_cast<uint>(scrollBar->activeSubControls)); #ifndef QT_NO_ANIMATION + // if the scrollbar is transient or its attributes, geometry or + // state has changed, the opacity is reset back to 100% opaque + opacity = 1.0; + QScrollbarStyleAnimation *anim = qobject_cast<QScrollbarStyleAnimation *>(d->animation(styleObject)); if (transient) { if (!anim) { diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index c6615a1945..39a3e110f3 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -3915,7 +3915,9 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q } QRect r = rect; +#if QT_CONFIG(animation) Q_D(const QWindowsStyle); +#endif if (pb->minimum == 0 && pb->maximum == 0) { int chunkCount = fillWidth/chunkWidth; int offset = 0; diff --git a/src/widgets/util/qflickgesture.cpp b/src/widgets/util/qflickgesture.cpp index 10e92e04e1..71c4458b79 100644 --- a/src/widgets/util/qflickgesture.cpp +++ b/src/widgets/util/qflickgesture.cpp @@ -292,6 +292,8 @@ protected: qFGDebug() << "QFG: ungrabbing" << grabber; grabber->ungrabMouse(); } +#else + Q_UNUSED(flags); #endif // QT_NO_GRAPHICSVIEW if (me) { diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp index 2249f4c4aa..19c22eca46 100644 --- a/src/widgets/util/qsystemtrayicon.cpp +++ b/src/widgets/util/qsystemtrayicon.cpp @@ -758,6 +758,8 @@ void QSystemTrayIconPrivate::addPlatformMenu(QMenu *menu) const QPlatformMenu *platformMenu = qpa_sys->createMenu(); if (platformMenu) menu->setPlatformMenu(platformMenu); +#else + Q_UNUSED(menu) #endif // QT_CONFIG(menu) } diff --git a/src/widgets/widgets/qabstractbutton.cpp b/src/widgets/widgets/qabstractbutton.cpp index c0bd8bce5a..77fb203b82 100644 --- a/src/widgets/widgets/qabstractbutton.cpp +++ b/src/widgets/widgets/qabstractbutton.cpp @@ -396,8 +396,7 @@ void QAbstractButtonPrivate::click() } blockRefresh = false; refresh(); - q->repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + q->repaint(); if (guard) emitReleased(); if (guard) @@ -834,8 +833,7 @@ void QAbstractButton::animateClick(int msec) if (d->checkable && focusPolicy() & Qt::ClickFocus) setFocus(); setDown(true); - repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + repaint(); if (!d->animateTimer.isActive()) d->emitPressed(); d->animateTimer.start(msec, this); @@ -977,8 +975,7 @@ void QAbstractButton::mousePressEvent(QMouseEvent *e) if (hitButton(e->pos())) { setDown(true); d->pressed = true; - repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + repaint(); d->emitPressed(); e->accept(); } else { @@ -1025,8 +1022,7 @@ void QAbstractButton::mouseMoveEvent(QMouseEvent *e) if (hitButton(e->pos()) != d->down) { setDown(!d->down); - repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + repaint(); if (d->down) d->emitPressed(); else @@ -1051,8 +1047,7 @@ void QAbstractButton::keyPressEvent(QKeyEvent *e) case Qt::Key_Space: if (!e->isAutoRepeat()) { setDown(true); - repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + repaint(); d->emitPressed(); } break; @@ -1103,8 +1098,7 @@ void QAbstractButton::keyPressEvent(QKeyEvent *e) #ifndef QT_NO_SHORTCUT if (e->matches(QKeySequence::Cancel) && d->down) { setDown(false); - repaint(); //flush paint event before invoking potentially expensive operation - QApplication::flush(); + repaint(); d->emitReleased(); return; } diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 272032d76f..0dde839629 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -2741,6 +2741,22 @@ void QComboBox::showPopup() bool startTimer = !container->isVisible(); container->raise(); + container->create(); + QWindow *containerWindow = container->window()->windowHandle(); + if (containerWindow) { + QWindow *win = window()->windowHandle(); + if (win) { + QScreen *currentScreen = win->screen(); + if (currentScreen && !currentScreen->virtualSiblings().contains(containerWindow->screen())) { + containerWindow->setScreen(currentScreen); + + // This seems to workaround an issue in xcb+multi GPU+multiscreen + // environment where the window might not always show up when screen + // is changed. + container->hide(); + } + } + } container->show(); container->updateScrollers(); view()->setFocus(); diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 59a1e99398..15f79638c8 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -49,7 +49,6 @@ #include <qwindow.h> #include <qscreen.h> #include <qmainwindow.h> -#include <qrubberband.h> #include <qstylepainter.h> #include <qtoolbutton.h> #include <qdebug.h> diff --git a/src/widgets/widgets/qdockwidget_p.h b/src/widgets/widgets/qdockwidget_p.h index 84bf8efacf..2d62cf5acd 100644 --- a/src/widgets/widgets/qdockwidget_p.h +++ b/src/widgets/widgets/qdockwidget_p.h @@ -63,7 +63,6 @@ QT_BEGIN_NAMESPACE class QGridLayout; class QWidgetResizeHandler; -class QRubberBand; class QDockWidgetTitleButton; class QSpacerItem; class QDockWidgetItem; diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index 8498835a34..4567f7c2a3 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -72,6 +72,7 @@ #include <private/qpushbutton_p.h> #include <private/qaction_p.h> #include <private/qguiapplication_p.h> +#include <qpa/qplatformtheme.h> QT_BEGIN_NAMESPACE @@ -127,9 +128,9 @@ public: setParent(parentWidget, Qt::Window | Qt::Tool); setAttribute(Qt::WA_DeleteOnClose, true); setAttribute(Qt::WA_X11NetWmWindowTypeMenu, true); - setWindowTitle(p->windowTitle()); + updateWindowTitle(); setEnabled(p->isEnabled()); -#if QT_CONFIG(cssparser) +#if QT_CONFIG(style_stylesheet) setStyleSheet(p->styleSheet()); #endif if (style() != p->style()) @@ -165,6 +166,15 @@ public: } } + void updateWindowTitle() + { + Q_D(QTornOffMenu); + if (!d->causedMenu) + return; + const QString &cleanTitle = QPlatformTheme::removeMnemonics(d->causedMenu->title()).trimmed(); + setWindowTitle(cleanTitle); + } + public slots: void onTrigger(QAction *action) { d_func()->activateAction(action, QAction::Trigger, false); } void onHovered(QAction *action) { d_func()->activateAction(action, QAction::Hover, false); } @@ -183,6 +193,10 @@ void QMenuPrivate::init() q->setAttribute(Qt::WA_X11NetWmWindowTypePopupMenu); defaultMenuAction = menuAction = new QAction(q); menuAction->d_func()->menu = q; + QObject::connect(menuAction, &QAction::changed, [=] { + if (!tornPopup.isNull()) + tornPopup->updateWindowTitle(); + }); q->setMouseTracking(q->style()->styleHint(QStyle::SH_Menu_MouseTracking, 0, q)); if (q->style()->styleHint(QStyle::SH_Menu_Scrollable, 0, q)) { scroll = new QMenuPrivate::QMenuScroller; @@ -313,8 +327,8 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const const int deskFw = style->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, &opt, q); const int tearoffHeight = tearoff ? style->pixelMetric(QStyle::PM_MenuTearoffHeight, &opt, q) : 0; const int base_y = vmargin + fw + topmargin + (scroll ? scroll->scrollOffset : 0) + tearoffHeight; + const int column_max_y = screen.height() - 2 * deskFw - (vmargin + bottommargin + fw); int max_column_width = 0; - int dh = screen.height(); int y = base_y; //for compatibility now - will have to refactor this away @@ -392,8 +406,7 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const if (!sz.isEmpty()) { max_column_width = qMax(max_column_width, sz.width()); //wrapping - if (!scroll && - y + sz.height() + vmargin + bottommargin + fw > dh - (deskFw * 2)) { + if (!scroll && y + sz.height() > column_max_y) { ncols++; y = base_y; } else { @@ -419,8 +432,7 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const QRect &rect = actionRects[i]; if (rect.isNull()) continue; - if (!scroll && - y + rect.height() + vmargin + bottommargin + fw > dh - deskFw * 2) { + if (!scroll && y + rect.height() > column_max_y) { x += max_column_width + hmargin; y = base_y; } @@ -2310,16 +2322,7 @@ void QMenu::popup(const QPoint &p, QAction *atAction) ensurePolished(); // Get the right font emit aboutToShow(); const bool actionListChanged = d->itemsDirty; - d->updateActionRects(); - QPoint pos; - QPushButton *causedButton = qobject_cast<QPushButton*>(d->causedPopup.widget); - if (actionListChanged && causedButton) - pos = QPushButtonPrivate::get(causedButton)->adjustedMenuPosition(); - else - pos = p; - const QSize menuSizeHint(sizeHint()); - QSize size = menuSizeHint; QRect screen; #ifndef QT_NO_GRAPHICSVIEW bool isEmbedded = !bypassGraphicsProxyWidget(this) && d->nearestGraphicsProxyWidget(this); @@ -2328,6 +2331,17 @@ void QMenu::popup(const QPoint &p, QAction *atAction) else #endif screen = d->popupGeometry(QApplication::desktop()->screenNumber(p)); + d->updateActionRects(screen); + + QPoint pos; + QPushButton *causedButton = qobject_cast<QPushButton*>(d->causedPopup.widget); + if (actionListChanged && causedButton) + pos = QPushButtonPrivate::get(causedButton)->adjustedMenuPosition(); + else + pos = p; + + const QSize menuSizeHint(sizeHint()); + QSize size = menuSizeHint; const int desktopFrame = style()->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, 0, this); bool adjustToDesktop = !window()->testAttribute(Qt::WA_DontShowOnScreen); diff --git a/src/widgets/widgets/qsplashscreen.cpp b/src/widgets/widgets/qsplashscreen.cpp index 4ad2b83582..2758af53ef 100644 --- a/src/widgets/widgets/qsplashscreen.cpp +++ b/src/widgets/widgets/qsplashscreen.cpp @@ -164,15 +164,14 @@ void QSplashScreen::mousePressEvent(QMouseEvent *) } /*! - This overrides QWidget::repaint(). It differs from the standard - repaint function in that it also calls QApplication::flush() to - ensure the updates are displayed, even when there is no event loop - present. + This overrides QWidget::repaint(). It differs from the standard repaint + function in that it also calls QApplication::processEvents() to ensure + the updates are displayed, even when there is no event loop present. */ void QSplashScreen::repaint() { QWidget::repaint(); - QApplication::flush(); + QApplication::processEvents(); } /*! @@ -190,13 +189,9 @@ void QSplashScreen::repaint() /*! Draws the \a message text onto the splash screen with color \a color and aligns the text according to the flags in \a alignment. - - To make sure the splash screen is repainted immediately, you can - call \l{QCoreApplication}'s - \l{QCoreApplication::}{processEvents()} after the call to - showMessage(). You usually want this to make sure that the message - is kept up to date with what your application is doing (e.g., - loading files). + This function calls repaint() to make sure the splash screen is + repainted immediately. As a result the message is kept up + to date with what your application is doing (e.g. loading files). \sa Qt::Alignment, clearMessage(), message() */ diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp index 1676c188a6..0c98c3875a 100644 --- a/src/widgets/widgets/qsplitter.cpp +++ b/src/widgets/widgets/qsplitter.cpp @@ -975,7 +975,9 @@ QSplitter::QSplitter(Qt::Orientation orientation, QWidget *parent) QSplitter::~QSplitter() { Q_D(QSplitter); +#if QT_CONFIG(rubberband) delete d->rubberBand; +#endif while (!d->list.isEmpty()) delete d->list.takeFirst(); } @@ -1296,18 +1298,19 @@ void QSplitter::childEvent(QChildEvent *c) qWarning("Adding a QLayout to a QSplitter is not supported."); return; } - QWidget *w = static_cast<QWidget*>(c->child()); - if (w->isWindow()) - return; - if (c->added() && !d->blockChildAdd && !d->findWidget(w)) { - d->insertWidget_helper(d->list.count(), w, false); - } else if (c->polished() && !d->blockChildAdd) { - if (d->shouldShowWidget(w)) + if (c->added()) { + QWidget *w = static_cast<QWidget*>(c->child()); + if (!d->blockChildAdd && !w->isWindow() && !d->findWidget(w)) + d->insertWidget_helper(d->list.count(), w, false); + } else if (c->polished()) { + QWidget *w = static_cast<QWidget*>(c->child()); + if (!d->blockChildAdd && !w->isWindow() && d->shouldShowWidget(w)) w->show(); - } else if (c->type() == QEvent::ChildRemoved) { + } else if (c->removed()) { + QObject *child = c->child(); for (int i = 0; i < d->list.size(); ++i) { QSplitterLayoutStruct *s = d->list.at(i); - if (s->widget == w) { + if (s->widget == child) { d->list.removeAt(i); delete s; d->recalc(isVisible()); @@ -1325,6 +1328,7 @@ void QSplitter::childEvent(QChildEvent *c) void QSplitter::setRubberBand(int pos) { +#if QT_CONFIG(rubberband) Q_D(QSplitter); if (pos < 0) { if (d->rubberBand) @@ -1345,6 +1349,9 @@ void QSplitter::setRubberBand(int pos) : QRect(QPoint(r.x(), pos + hw / 2 - rBord), QSize(r.width(), 2 * rBord)); d->rubberBand->setGeometry(newGeom); d->rubberBand->show(); +#else + Q_UNUSED(pos); +#endif } /*! diff --git a/src/widgets/widgets/qsplitter_p.h b/src/widgets/widgets/qsplitter_p.h index 07b43e56b8..0730fab824 100644 --- a/src/widgets/widgets/qsplitter_p.h +++ b/src/widgets/widgets/qsplitter_p.h @@ -81,11 +81,17 @@ class QSplitterPrivate : public QFramePrivate { Q_DECLARE_PUBLIC(QSplitter) public: - QSplitterPrivate() : rubberBand(0), opaque(true), firstShow(true), + QSplitterPrivate() : +#if QT_CONFIG(rubberband) + rubberBand(0), +#endif + opaque(true), firstShow(true), childrenCollapsible(true), compatMode(false), handleWidth(-1), blockChildAdd(false), opaqueResizeSet(false) {} ~QSplitterPrivate(); +#if QT_CONFIG(rubberband) QPointer<QRubberBand> rubberBand; +#endif mutable QList<QSplitterLayoutStruct *> list; Qt::Orientation orient; bool opaque : 8; diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 363e7157ac..905bc0f586 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -1704,7 +1704,9 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event) } bool unknown = false; +#if QT_CONFIG(shortcut) bool visual = cursorMoveStyle() == Qt::VisualMoveStyle; +#endif if (false) { } |