summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp2
-rw-r--r--src/widgets/accessible/simplewidgets.cpp5
-rw-r--r--src/widgets/configure.json5
-rw-r--r--src/widgets/dialogs/qerrormessage.cpp45
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp4
-rw-r--r--src/widgets/dialogs/qfiledialog_p.h41
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp2
-rw-r--r--src/widgets/doc/images/tableWidget-stylesheet.pngbin3478 -> 14135 bytes
-rw-r--r--src/widgets/doc/snippets/code/doc_src_stylesheet.qdoc6
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc6
-rw-r--r--src/widgets/itemviews/qabstractitemdelegate.cpp2
-rw-r--r--src/widgets/kernel/qapplication.cpp4
-rw-r--r--src/widgets/kernel/qopenglwidget.cpp8
-rw-r--r--src/widgets/styles/qfusionstyle.cpp10
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp2
-rw-r--r--src/widgets/util/qflickgesture.cpp2
-rw-r--r--src/widgets/util/qsystemtrayicon.cpp2
-rw-r--r--src/widgets/widgets/qabstractbutton.cpp18
-rw-r--r--src/widgets/widgets/qcombobox.cpp16
-rw-r--r--src/widgets/widgets/qdockwidget.cpp1
-rw-r--r--src/widgets/widgets/qdockwidget_p.h1
-rw-r--r--src/widgets/widgets/qmenu.cpp46
-rw-r--r--src/widgets/widgets/qsplashscreen.cpp19
-rw-r--r--src/widgets/widgets/qsplitter.cpp25
-rw-r--r--src/widgets/widgets/qsplitter_p.h8
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol.cpp2
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
index e99e7a97c8..8c0669838c 100644
--- a/src/widgets/doc/images/tableWidget-stylesheet.png
+++ b/src/widgets/doc/images/tableWidget-stylesheet.png
Binary files differ
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) {
}