Add menu creation manual test
We have found that there are three important operations when it comes to menu creation and putting it up in the native menubar: * Adding the action to its parent menu * Setting the submenu as the action's menu * Populating the actual submenu This application tests all possible permutations for these three operations, starting from the menubar and down two more menu levels. Two command-line options allow, first, to create a late menubar that will replace the original menubar from the main window form (--new-menubar) with, second, the option of creating it parentless (--no-parent) before setting it as the new main window menubar. While mostly interesting for platforms supporting QPA menus and menubars, this could be useful as a trivial check for QMenu and QMenuBar in a pure QWidget environment. As of today, the application shows at least three issues on macOS which will be fixed in upcoming patches. Change-Id: Id3c1e0f346c6fe27ab4656ff045b88a0a8623740 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
parent
9c58dd1588
commit
0261c22d41
@ -0,0 +1,34 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2017-10-19T16:07:04
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = BigMenuCreator
|
||||
TEMPLATE = app
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which as been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
mainwindow.cpp
|
||||
|
||||
HEADERS += \
|
||||
mainwindow.h
|
||||
|
||||
FORMS += \
|
||||
mainwindow.ui
|
54
tests/manual/widgets/widgets/bigmenucreator/main.cpp
Normal file
54
tests/manual/widgets/widgets/bigmenucreator/main.cpp
Normal file
@ -0,0 +1,54 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include <QApplication>
|
||||
#include <QCommandLineParser>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QCommandLineParser parser;
|
||||
parser.setApplicationDescription("BigMenuCreator");
|
||||
parser.addHelpOption();
|
||||
parser.addOptions({
|
||||
{ "new-menubar", QLatin1String("Use new menubar instead of QMainWindow's own.") },
|
||||
{ "no-parent", QLatin1String("When using a new menubar, do *not* set its parent on construction.") }
|
||||
});
|
||||
|
||||
parser.process(a);
|
||||
|
||||
MainWindow::newMenubar = parser.isSet("new-menubar");
|
||||
MainWindow::parentlessMenubar = parser.isSet("no-parent");
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
139
tests/manual/widgets/widgets/bigmenucreator/mainwindow.cpp
Normal file
139
tests/manual/widgets/widgets/bigmenucreator/mainwindow.cpp
Normal file
@ -0,0 +1,139 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
bool MainWindow::newMenubar = false;
|
||||
bool MainWindow::parentlessMenubar = false;
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
const int level = 3;
|
||||
QMenuBar *mb;
|
||||
if (newMenubar)
|
||||
mb = new QMenuBar(parentlessMenubar ? nullptr : this);
|
||||
else
|
||||
mb = ui->menuBar;
|
||||
populateMenu(mb, level);
|
||||
if (newMenubar)
|
||||
setMenuBar(mb);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
// We do all the permutations on the following 3 operations:
|
||||
//
|
||||
// A: Add action to parent menu
|
||||
// P: Populate the submenu
|
||||
// S: Set action submenu
|
||||
//
|
||||
// Recursing on menu population gives more combinations of
|
||||
// creation and insertions.
|
||||
|
||||
void MainWindow::populateMenu(QWidget *menu, int level)
|
||||
{
|
||||
if (level > 0) {
|
||||
--level;
|
||||
doAPS(menu, level);
|
||||
doASP(menu, level);
|
||||
doPAS(menu, level);
|
||||
doSPA(menu, level);
|
||||
doSAP(menu, level);
|
||||
doPSA(menu, level);
|
||||
} else {
|
||||
static int itemCounter = 0;
|
||||
static const char *sym[] = { "Foo", "Bar", "Baz", "Quux" };
|
||||
for (uint i = 0; i < sizeof(sym) / sizeof(sym[0]); i++) {
|
||||
QString title = QString::fromLatin1("%1 Item %2").arg(QLatin1String(sym[i])).arg(itemCounter);
|
||||
menu->addAction(new QAction(title));
|
||||
}
|
||||
++itemCounter;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::doAPS(QWidget *menu, int level)
|
||||
{
|
||||
auto *action = new QAction("A P S");
|
||||
menu->addAction(action);
|
||||
auto *submenu = new QMenu;
|
||||
populateMenu(submenu, level);
|
||||
action->setMenu(submenu);
|
||||
}
|
||||
|
||||
void MainWindow::doASP(QWidget *menu, int level)
|
||||
{
|
||||
auto *action = new QAction("A S P");
|
||||
menu->addAction(action);
|
||||
auto *submenu = new QMenu;
|
||||
action->setMenu(submenu);
|
||||
populateMenu(submenu, level);
|
||||
}
|
||||
|
||||
void MainWindow::doPAS(QWidget *menu, int level)
|
||||
{
|
||||
auto *submenu = new QMenu;
|
||||
populateMenu(submenu, level);
|
||||
auto *action = new QAction("P A S");
|
||||
menu->addAction(action);
|
||||
action->setMenu(submenu);
|
||||
}
|
||||
|
||||
void MainWindow::doSPA(QWidget *menu, int level)
|
||||
{
|
||||
auto *action = new QAction("S P A");
|
||||
auto *submenu = new QMenu;
|
||||
action->setMenu(submenu);
|
||||
populateMenu(submenu, level);
|
||||
menu->addAction(action);
|
||||
}
|
||||
|
||||
void MainWindow::doSAP(QWidget *menu, int level)
|
||||
{
|
||||
auto *action = new QAction("S A P");
|
||||
auto *submenu = new QMenu;
|
||||
action->setMenu(submenu);
|
||||
menu->addAction(action);
|
||||
populateMenu(submenu, level);
|
||||
}
|
||||
|
||||
void MainWindow::doPSA(QWidget *menu, int level)
|
||||
{
|
||||
auto *action = new QAction("P S A");
|
||||
auto *submenu = new QMenu;
|
||||
populateMenu(submenu, level);
|
||||
action->setMenu(submenu);
|
||||
menu->addAction(action);
|
||||
}
|
63
tests/manual/widgets/widgets/bigmenucreator/mainwindow.h
Normal file
63
tests/manual/widgets/widgets/bigmenucreator/mainwindow.h
Normal file
@ -0,0 +1,63 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
void doAPS(QWidget *menu, int level);
|
||||
void doASP(QWidget *menu, int level);
|
||||
void doPAS(QWidget *menu, int level);
|
||||
|
||||
void doSPA(QWidget *menu, int level);
|
||||
void doSAP(QWidget *menu, int level);
|
||||
void doPSA(QWidget *menu, int level);
|
||||
|
||||
void populateMenu(QWidget *menu, int level);
|
||||
|
||||
static bool newMenubar;
|
||||
static bool parentlessMenubar;
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
74
tests/manual/widgets/widgets/bigmenucreator/mainwindow.ui
Normal file
74
tests/manual/widgets/widgets/bigmenucreator/mainwindow.ui
Normal file
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>427</width>
|
||||
<height>372</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'.SF NS Text'; font-size:16pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">We do all the permutations on the following 3 operations:</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;"> A</span><span style=" font-size:14pt;">: Add action to parent menu</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;"> P</span><span style=" font-size:14pt;">: Populate the submenu</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;"> S</span><span style=" font-size:14pt;">: Set action submenu</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">This gets repeated 2 menu levels from the menubar. All menus and items are enabled and should show as such.</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">The order of menus is APS, ASP, PAS, SPA, SAP, PSA.</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">The order of terminal items is &quot;Foo&quot;, &quot;Bar&quot;, &quot;Baz&quot;, &quot;Quux&quot;.</span></p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;"><br /></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">Rerun with &quot;--new-menubar&quot; and &quot;--no-parent&quot; to force using a new menubar instead of QMainWindow's own, with or without parent. QMainWindow::setMenuBar() will be called regardless of the parent option.</span></p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>427</width>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QToolBar" name="mainToolBar">
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
Loading…
Reference in New Issue
Block a user