118static void showHelp(QCommandLineParser &parser,
const QString &errorMessage = QString())
121 QTextStream str(&text);
122 str <<
"<html><head/><body>";
123 if (!errorMessage.isEmpty())
124 str <<
"<p>" << errorMessage <<
"</p>";
125 str <<
"<pre>" << parser.helpText().toHtmlEscaped() <<
"</pre></body></html>";
126 QMessageBox box(errorMessage.isEmpty() ? QMessageBox::Information : QMessageBox::Warning,
127 QGuiApplication::applicationDisplayName(), text,
129 box.setTextInteractionFlags(Qt::TextBrowserInteraction);
135 QString *errorMessage)
137 parser.setApplicationDescription(u"Qt Widgets Designer " QT_VERSION_STR
"\n\nUI designer for QWidget-based applications."_s);
138 const QCommandLineOption helpOption = parser.addHelpOption();
139 parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
140 const QCommandLineOption localSocketClientOption(u"local-client"_s,
141 u"Local socket client mode"_s,
143 parser.addOption(localSocketClientOption);
144 const QCommandLineOption tcpServerOption(u"server"_s, u"TCP Server mode (deprecated)"_s);
145 parser.addOption(tcpServerOption);
146 const QCommandLineOption tcpClientOption(u"client"_s, u"TCP Client mode (deprecated)"_s,
148 parser.addOption(tcpClientOption);
149 const QCommandLineOption webHelpOption(u"web-help"_s, u"Use the Web documentation"_s);
150 parser.addOption(webHelpOption);
151 const QCommandLineOption pythonHelpOption(u"python-help"_s, u"Use the Python documentation"_s);
152 parser.addOption(pythonHelpOption);
153 const QCommandLineOption resourceDirOption(u"resourcedir"_s,
154 u"Resource directory"_s,
156 parser.addOption(resourceDirOption);
157 const QCommandLineOption internalDynamicPropertyOption(u"enableinternaldynamicproperties"_s,
158 u"Enable internal dynamic properties"_s);
159 parser.addOption(internalDynamicPropertyOption);
160 const QCommandLineOption pluginPathsOption(u"plugin-path"_s,
161 u"Default plugin path list"_s,
163 parser.addOption(pluginPathsOption);
165 const QCommandLineOption qtVersionOption(u"qt-version"_s,
166 u"Qt Version for writing .ui files"_s,
168 parser.addOption(qtVersionOption);
170 parser.addPositionalArgument(u"files"_s,
171 u"The UI files to open."_s);
173 if (!parser.parse(QCoreApplication::arguments())) {
174 *errorMessage = parser.errorText();
175 return QDesigner::ParseArgumentsError;
178 if (parser.isSet(helpOption))
179 return QDesigner::ParseArgumentsHelpRequested;
182 if (parser.isSet(u"help-all"_s))
183 parser.process(QCoreApplication::arguments());
184 options
->server = parser.isSet(tcpServerOption);
185 if (parser.isSet(localSocketClientOption)) {
186 options->localSocketServerName = parser.value(localSocketClientOption);
187 }
else if (parser.isSet(tcpClientOption)) {
189 options->tcpClientPort = parser.value(tcpClientOption).toUShort(&ok);
191 *errorMessage = u"Non-numeric argument specified for -client"_s;
192 return QDesigner::ParseArgumentsError;
195 if (parser.isSet(webHelpOption))
197 else if (parser.isSet(pythonHelpOption))
199 if (parser.isSet(resourceDirOption))
200 options->resourceDir = parser.value(resourceDirOption);
201 const auto pluginPathValues = parser.values(pluginPathsOption);
202 for (
const auto &pluginPath : pluginPathValues)
203 options->pluginPaths.append(pluginPath.split(QDir::listSeparator(), Qt::SkipEmptyParts));
205 if (parser.isSet(qtVersionOption))
206 options->qtVersion = QVersionNumber::fromString(parser.value(qtVersionOption));
209 options->files = parser.positionalArguments();
210 return QDesigner::ParseArgumentsSuccess;
227 QString errorMessage;
229 QCommandLineParser parser;
230 const ParseArgumentsResult result = parseDesignerCommandLineArguments(parser, &options, &errorMessage);
231 if (result != ParseArgumentsSuccess) {
232 showHelp(parser, errorMessage);
236 if (!options.localSocketServerName.isEmpty())
237 m_client =
new QDesignerLocalSocketClient(options.localSocketServerName,
this);
238 else if (options.tcpClientPort != 0)
239 m_client =
new QDesignerTcpClient(options.tcpClientPort,
this);
243 printf(
"%d\n", server->serverPort());
246 if (options.enableInternalDynamicProperties)
247 QDesignerPropertySheet::setInternalDynamicPropertiesEnabled(
true);
249#if QT_CONFIG(translation)
250 const QStringList &trPaths = options.resourceDir.isEmpty()
251 ? QLibraryInfo::paths(QLibraryInfo::TranslationsPath)
252 : QStringList{ options.resourceDir };
253 auto designerTranslator = std::make_unique<QTranslator>(
this);
254 auto qtTranslator = std::make_unique<QTranslator>(
this);
255 if (loadTranslation(trPaths, designerTranslator, u"designer"_s)
256 && loadTranslation(trPaths, qtTranslator, u"qtbase"_s)) {
257 installTranslator(designerTranslator.release());
258 installTranslator(qtTranslator.release());
262 m_workbench =
new QDesignerWorkbench(options);
266 Q_ASSERT(previousMessageHandler);
270 for (
auto fileName : std::as_const(options.files)) {
272 const QFileInfo fi(fileName);
273 if (fi.exists() && fi.isRelative())
274 fileName = fi.absoluteFilePath();
275 m_workbench->readInForm(fileName);
279 suppressNewFormShow =
true;
281 if (options.qtVersion.has_value()) {
282#if QT_VERSION >= QT_VERSION_CHECK(6
, 9
, 0
)
283 m_workbench->core()->integration()->setQtVersion(options.qtVersion.value());
285 auto version = QVariant::fromValue(options.qtVersion.value());
286 m_workbench
->core()->integration()->setProperty(
"qtVersion", version);
291 if (m_initializationErrors.isEmpty()) {
295 showErrorMessageBox(m_initializationErrors);
296 m_initializationErrors.clear();