diff options
-rw-r--r-- | dist/changes-5.0.0 | 5 | ||||
-rw-r--r-- | examples/widgets/dialogs/configdialog/main.cpp | 1 | ||||
-rw-r--r-- | src/gui/kernel/qplatformwindow.cpp | 7 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 18 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 13 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 39 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp | 18 |
7 files changed, 51 insertions, 50 deletions
diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0 index a969fc84d5..84f0224bad 100644 --- a/dist/changes-5.0.0 +++ b/dist/changes-5.0.0 @@ -985,6 +985,11 @@ Qt for Windows CE Please, notice that QMetaType::UnknownType has value 0, which previously was reserved for QMetaType::Void. +- QWidget + + * No need to set the application name in setWindowTitle() anymore, this is done + automatically, on Windows and Unix/X11, provided that the (possibly translated) + application display name is set with QGuiApplication::setApplicationDisplayName(). - QMessageBox diff --git a/examples/widgets/dialogs/configdialog/main.cpp b/examples/widgets/dialogs/configdialog/main.cpp index 20a2709a1e..b23c64a56f 100644 --- a/examples/widgets/dialogs/configdialog/main.cpp +++ b/examples/widgets/dialogs/configdialog/main.cpp @@ -47,6 +47,7 @@ int main(int argc, char *argv[]) Q_INIT_RESOURCE(configdialog); QApplication app(argc, argv); + app.setApplicationDisplayName("Qt Example"); ConfigDialog dialog; return dialog.exec(); } diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index 88dccdb6ce..82547b04ec 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -247,7 +247,12 @@ void QPlatformWindow::setParent(const QPlatformWindow *parent) } /*! - Reimplement to set the window title to \a title + Reimplement to set the window title to \a title. + + The implementation might want to append the application display name to + the window title, like Windows and Linux do. + + \sa QGuiApplication::applicationDisplayName() */ void QPlatformWindow::setWindowTitle(const QString &title) { Q_UNUSED(title); } diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 2f2588bc4a..40e0cf7dda 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -55,6 +55,7 @@ #include <QtGui/QWindow> #include <QtGui/QRegion> #include <private/qwindow_p.h> +#include <private/qguiapplication_p.h> #include <qpa/qwindowsysteminterface.h> #include <QtCore/QDebug> @@ -1188,8 +1189,21 @@ void QWindowsWindow::setWindowTitle(const QString &title) { if (QWindowsContext::verboseWindows) qDebug() << __FUNCTION__ << this << window() <<title; - if (m_data.hwnd) - SetWindowText(m_data.hwnd, (const wchar_t*)title.utf16()); + if (m_data.hwnd) { + + QString fullTitle = title; + if (QGuiApplicationPrivate::displayName) { + // Append display name, if set. + if (!fullTitle.isEmpty()) + fullTitle += QStringLiteral(" - "); + fullTitle += *QGuiApplicationPrivate::displayName; + } else if (fullTitle.isEmpty()) { + // Don't let the window title be completely empty, use the app name as fallback. + fullTitle = QCoreApplication::applicationName(); + } + + SetWindowText(m_data.hwnd, (const wchar_t*)fullTitle.utf16()); + } } void QWindowsWindow::setWindowFlags(Qt::WindowFlags flags) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 05d7dc4da9..21254e4b3b 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1116,7 +1116,18 @@ void QXcbWindow::setParent(const QPlatformWindow *parent) void QXcbWindow::setWindowTitle(const QString &title) { - QByteArray ba = title.toUtf8(); + QString fullTitle = title; + if (QGuiApplicationPrivate::displayName) { + // Append display name, if set. + if (!fullTitle.isEmpty()) + fullTitle += QString::fromUtf8(" \xe2\x80\x94 "); // unicode character U+2014, EM DASH + fullTitle += *QGuiApplicationPrivate::displayName; + } else if (fullTitle.isEmpty()) { + // Don't let the window title be completely empty, use the app name as fallback. + fullTitle = QCoreApplication::applicationName(); + } + const QByteArray ba = fullTitle.toUtf8(); + Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index ab7330594f..38d3198f2f 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -5474,18 +5474,6 @@ void QWidget::unsetLocale() d->resolveLocale(); } -static QString constructWindowTitleFromFilePath(const QString &filePath) -{ - QFileInfo fi(filePath); - QString windowTitle = fi.fileName() + QLatin1String("[*]"); -#ifndef Q_WS_MAC - QString appName = QApplication::applicationName(); - if (!appName.isEmpty()) - windowTitle += QLatin1Char(' ') + QChar(0x2014) + QLatin1Char(' ') + appName; -#endif - return windowTitle; -} - /*! \property QWidget::windowTitle \brief the window title (caption) @@ -5502,6 +5490,11 @@ static QString constructWindowTitleFromFilePath(const QString &filePath) windowModified property is false (the default), the placeholder is simply removed. + On some desktop platforms (including Windows and Unix), the application name + (from QGuiApplication::applicationDisplayName) is added at the end of the + window title, if set. This is done by the QPA plugin, so it is shown to the + user, but isn't part of the \l windowTitle string. + \sa windowIcon, windowIconText, windowModified, windowFilePath */ QString QWidget::windowTitle() const @@ -5511,7 +5504,7 @@ QString QWidget::windowTitle() const if (!d->extra->topextra->caption.isEmpty()) return d->extra->topextra->caption; if (!d->extra->topextra->filePath.isEmpty()) - return constructWindowTitleFromFilePath(d->extra->topextra->filePath); + return QFileInfo(d->extra->topextra->filePath).fileName() + QLatin1String("[*]"); } return QString(); } @@ -5683,24 +5676,8 @@ QString QWidget::windowIconText() const This property only makes sense for windows. It associates a file path with a window. If you set the file path, but have not set the window title, Qt - sets the window title to contain a string created using the following - components. - - On Mac OS X: - - \list - \li The file name of the specified path, obtained using QFileInfo::fileName(). - \endlist - - On Windows and X11: - - \list - \li The file name of the specified path, obtained using QFileInfo::fileName(). - \li An optional \c{*} character, if the \l windowModified property is set. - \li The \c{0x2014} unicode character, padded either side by spaces. - \li The application name, obtained from the application's - \l{QCoreApplication::}{applicationName} property. - \endlist + sets the window title to the file name of the specified path, obtained using + QFileInfo::fileName(). If the window title is set at any point, then the window title takes precedence and will be shown instead of the file path string. diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp index 230fcebfcb..058831af2e 100644 --- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp +++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp @@ -230,28 +230,16 @@ void tst_QWidget_window::tst_windowFilePathAndwindowTitle_data() QString validPath = QApplication::applicationFilePath(); QString fileNameOnly = QFileInfo(validPath).fileName() + QLatin1String("[*]"); - QString fileAndSep = fileNameOnly + QLatin1String(" ") + QChar(0x2014) + QLatin1String(" "); QString windowTitle = QLatin1String("Here is a Window Title"); - - QString defaultPlatString = -#if 0 // was ifdef Q_OS_MAC, but that code is disabled in qwidget.cpp and caption handling should move to QPA anyway - fileNameOnly; -#else - fileAndSep + "tst_qwidget_window"; // default app name in Qt5 -#endif + QString defaultPlatString = fileNameOnly; QTest::newRow("never Set Title nor AppName") << false << false << validPath << QString() << windowTitle << defaultPlatString << defaultPlatString; QTest::newRow("set title after only, but no AppName") << false << true << validPath << QString() << windowTitle << defaultPlatString << windowTitle; QTest::newRow("set title before only, not AppName") << true << false << validPath << QString() << windowTitle << windowTitle << windowTitle; QTest::newRow("always set title, not appName") << true << true << validPath << QString() << windowTitle << windowTitle << windowTitle; - QString appName = QLatin1String("Killer App"); - QString platString = -#if 0 // was ifdef Q_OS_MAC, but that code is disabled in qwidget.cpp and caption handling should move to QPA anyway - fileNameOnly; -#else - fileAndSep + appName; -#endif + QString appName = QLatin1String("Killer App"); // Qt4 used to make it part of windowTitle(), Qt5 doesn't anymore, the QPA plugin takes care of it. + QString platString = fileNameOnly; QTest::newRow("never Set Title, yes AppName") << false << false << validPath << appName << windowTitle << platString << platString; QTest::newRow("set title after only, yes AppName") << false << true << validPath << appName << windowTitle << platString << windowTitle; |