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