22#include <QtCore/qpointer.h>
37 case TextValueSelectedSignal:
return SIGNAL(textValueSelected(QString));
38 case IntValueSelectedSignal:
return SIGNAL(intValueSelected(
int));
39 case DoubleValueSelectedSignal:
return SIGNAL(doubleValueSelected(
double));
44 Q_UNREACHABLE_RETURN(
nullptr);
49 QByteArray normalizedMember(QMetaObject::normalizedSignature(member));
52 if (QMetaObject::checkConnectArgs(candidateSignal(i), normalizedMember))
56 return SIGNAL(accepted());
62
63
64
65
66
67class QInputDialogSpinBox :
public QSpinBox
72 QInputDialogSpinBox(QWidget *parent)
74 connect(lineEdit(), &QLineEdit::textChanged,
75 this, &QInputDialogSpinBox::notifyTextChanged);
76 connect(
this, &QInputDialogSpinBox::editingFinished,
77 this, &QInputDialogSpinBox::notifyTextChanged);
81 void textChanged(
bool);
84 void notifyTextChanged() { emit textChanged(hasAcceptableInput()); }
87 void keyPressEvent(QKeyEvent *event) override {
88 if ((event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) && !hasAcceptableInput()) {
89 setProperty(
"value", property(
"value"));
91 QSpinBox::keyPressEvent(event);
96 void mousePressEvent(QMouseEvent *event) override {
97 QSpinBox::mousePressEvent(event);
143 if (query == Qt::ImEnabled)
145 return QListView::inputMethodQuery(query);
151 Q_DECLARE_PUBLIC(QInputDialog)
192 : label(
nullptr), buttonBox(
nullptr),
lineEdit(
nullptr), plainTextEdit(
nullptr), intSpinBox(
nullptr), doubleSpinBox(
nullptr),
193 comboBox(
nullptr),
listView(
nullptr), inputWidget(
nullptr), mainLayout(
nullptr)
206 inputWidget = lineEdit;
210 label =
new QLabel(QInputDialog::tr(
"Enter a value:"), q);
211#ifndef QT_NO_SHORTCUT
212 label->setBuddy(inputWidget);
214 label->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
216 buttonBox =
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, q);
217 QObject::connect(buttonBox, &QDialogButtonBox::accepted, q, &QDialog::accept);
218 QObject::connect(buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject);
220 mainLayout =
new QVBoxLayout(q);
221 mainLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
222 mainLayout->addWidget(label);
223 mainLayout->addWidget(inputWidget);
224 mainLayout->addWidget(buttonBox);
225 ensureEnabledConnection(qobject_cast<QAbstractSpinBox *>(inputWidget));
233 lineEdit =
new QLineEdit(q);
235 qt_widget_private(
lineEdit)->inheritsInputMethodHints = 1;
238 QObjectPrivate::connect(lineEdit, &QLineEdit::textChanged,
239 this, &QInputDialogPrivate::textChanged);
246 if (!plainTextEdit) {
247 plainTextEdit =
new QPlainTextEdit(q);
248 plainTextEdit->setLineWrapMode(QPlainTextEdit::NoWrap);
250 qt_widget_private(plainTextEdit)->inheritsInputMethodHints = 1;
252 plainTextEdit->hide();
253 QObjectPrivate::connect(plainTextEdit, &QPlainTextEdit::textChanged,
254 this, &QInputDialogPrivate::plainTextEditTextChanged);
262 comboBox =
new QComboBox(q);
264 qt_widget_private(comboBox)->inheritsInputMethodHints = 1;
267 QObjectPrivate::connect(comboBox, &QComboBox::editTextChanged,
268 this, &QInputDialogPrivate::textChanged);
269 QObjectPrivate::connect(comboBox, &QComboBox::currentTextChanged,
270 this, &QInputDialogPrivate::textChanged);
279 listView =
new QInputDialogListView(q);
281 listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
282 listView->setSelectionMode(QAbstractItemView::SingleSelection);
283 listView->setModel(comboBox->model());
284 listView->setCurrentIndex(QModelIndex());
285 QObjectPrivate::connect(listView->selectionModel(),
286 &QItemSelectionModel::currentRowChanged,
287 this, &QInputDialogPrivate::currentRowChanged);
295 intSpinBox =
new QInputDialogSpinBox(q);
297 QObject::connect(intSpinBox, &QInputDialogSpinBox::valueChanged,
298 q, &QInputDialog::intValueChanged);
305 if (!doubleSpinBox) {
306 doubleSpinBox =
new QInputDialogDoubleSpinBox(q);
307 doubleSpinBox->hide();
308 QObject::connect(doubleSpinBox, &QInputDialogDoubleSpinBox::valueChanged,
309 q, &QInputDialog::doubleValueChanged);
316 QAbstractButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
317 QObject::connect(spinBox, SIGNAL(textChanged(
bool)), okButton, SLOT(setEnabled(
bool)), Qt::UniqueConnection);
324 if (inputWidget == widget)
328 Q_ASSERT(inputWidget);
329 mainLayout->removeWidget(inputWidget);
331 mainLayout->insertWidget(1, widget);
335 QAbstractButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
336 if (QAbstractSpinBox *spinBox = qobject_cast<QAbstractSpinBox *>(inputWidget))
337 QObject::disconnect(spinBox, SIGNAL(textChanged(
bool)), okButton, SLOT(setEnabled(
bool)));
340 QAbstractSpinBox *spinBox = qobject_cast<QAbstractSpinBox *>(widget);
342 okButton->setEnabled(!spinBox || spinBox->hasAcceptableInput());
345 inputWidget = widget;
350 lineEdit->setText(textValue);
351 }
else if (widget == plainTextEdit) {
352 plainTextEdit->setPlainText(textValue);
353 }
else if (widget == comboBox) {
354 setComboBoxText(textValue);
356 setListViewText(textValue);
358 buttonBox->button(QDialogButtonBox::Ok)->setEnabled(listView->selectionModel()->hasSelection());
367 if ((opts & QInputDialog::UseListViewForComboBoxItems) && !comboBox->isEditable()) {
373 }
else if (opts & QInputDialog::UsePlainTextEditForTextInput) {
375 widget = plainTextEdit;
381 setInputWidget(widget);
383 if (inputWidget == comboBox) {
384 textChanged(comboBox->currentText());
385 }
else if (inputWidget == listView) {
386 textChanged(listViewText());
392 int index = comboBox->findText(text);
394 comboBox->setCurrentIndex(index);
395 }
else if (comboBox->isEditable()) {
396 comboBox->setEditText(text);
402 int row = comboBox->findText(text);
404 QModelIndex index(comboBox->model()->index(row, 0));
405 listView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::Clear
406 | QItemSelectionModel::SelectCurrent);
412 if (
listView->selectionModel()->hasSelection()) {
413 int row =
listView->selectionModel()->selectedRows().value(0).row();
414 return comboBox->itemText(row);
423 if (textValue != text) {
425 emit q->textValueChanged(text);
432 QString text = plainTextEdit->toPlainText();
433 if (textValue != text) {
435 emit q->textValueChanged(text);
440 const QModelIndex & )
442 textChanged(comboBox->model()->data(newIndex).toString());
443 buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
true);
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
474
475
476
477
478
479
480
481
482
483
484
485
488
489
490QInputDialog::QInputDialog(QWidget *parent, Qt::WindowFlags flags)
491 : QDialog(*
new QInputDialogPrivate, parent, flags)
496
497
498QInputDialog::~QInputDialog()
503
504
505
506
507
508
509
510void QInputDialog::setInputMode(InputMode mode)
517
518
519
520
524 d->ensureIntSpinBox();
525 widget = d->intSpinBox;
528 d->ensureDoubleSpinBox();
529 widget = d->doubleSpinBox;
532 Q_ASSERT(mode == TextInput);
533 d->chooseRightTextInputWidget();
537 d->setInputWidget(widget);
540QInputDialog::InputMode QInputDialog::inputMode()
const
542 Q_D(
const QInputDialog);
544 if (d->inputWidget) {
545 if (d->inputWidget == d->intSpinBox) {
547 }
else if (d->inputWidget == d->doubleSpinBox) {
556
557
558
559
560void QInputDialog::setLabelText(
const QString &text)
564 d->label =
new QLabel(text,
this);
566 d->label->setText(text);
570QString QInputDialog::labelText()
const
572 Q_D(
const QInputDialog);
574 return d->label->text();
578
579
580
581
582
583
584
585
586
587
588
589
590
593
594
595
596
597
598void QInputDialog::setOption(InputDialogOption option,
bool on)
601 if (!(d->opts & option) != !on)
602 setOptions(d->opts ^ option);
606
607
608
609
610
611bool QInputDialog::testOption(InputDialogOption option)
const
613 Q_D(
const QInputDialog);
614 return (d->opts & option) != 0;
618
619
620
621
622
623
624
625void QInputDialog::setOptions(InputDialogOptions options)
629 InputDialogOptions changed = (options ^ d->opts);
636 if (changed & NoButtons)
637 d->buttonBox->setVisible(!(options & NoButtons));
638 if ((changed & UseListViewForComboBoxItems) && inputMode() == TextInput)
639 d->chooseRightTextInputWidget();
640 if ((changed & UsePlainTextEditForTextInput) && inputMode() == TextInput)
641 d->chooseRightTextInputWidget();
644QInputDialog::InputDialogOptions QInputDialog::options()
const
646 Q_D(
const QInputDialog);
651
652
653
654
655
656
657
658void QInputDialog::setTextValue(
const QString &text)
662 setInputMode(TextInput);
663 if (d->inputWidget == d->lineEdit) {
664 d->lineEdit->setText(text);
665 }
else if (d->inputWidget == d->plainTextEdit) {
666 d->plainTextEdit->setPlainText(text);
667 }
else if (d->inputWidget == d->comboBox) {
668 d->setComboBoxText(text);
670 d->setListViewText(text);
674QString QInputDialog::textValue()
const
676 Q_D(
const QInputDialog);
681
682
683
684
685
686
687
688void QInputDialog::setTextEchoMode(QLineEdit::EchoMode mode)
692 d->lineEdit->setEchoMode(mode);
695QLineEdit::EchoMode QInputDialog::textEchoMode()
const
697 Q_D(
const QInputDialog);
699 return d->lineEdit->echoMode();
701 return QLineEdit::Normal;
706
707
708
709
710void QInputDialog::setComboBoxEditable(
bool editable)
714 d->comboBox->setEditable(editable);
715 if (inputMode() == TextInput)
716 d->chooseRightTextInputWidget();
719bool QInputDialog::isComboBoxEditable()
const
721 Q_D(
const QInputDialog);
723 return d->comboBox->isEditable();
730
731
732
733
734void QInputDialog::setComboBoxItems(
const QStringList &items)
740 const QSignalBlocker blocker(d->comboBox);
741 d->comboBox->clear();
742 d->comboBox->addItems(items);
745 if (inputMode() == TextInput)
746 d->chooseRightTextInputWidget();
749QStringList QInputDialog::comboBoxItems()
const
751 Q_D(
const QInputDialog);
754 const int count = d->comboBox->count();
755 result.reserve(count);
756 for (
int i = 0; i < count; ++i)
757 result.append(d->comboBox->itemText(i));
763
764
765
766
767
768
769void QInputDialog::setIntValue(
int value)
772 setInputMode(IntInput);
773 d->intSpinBox->setValue(value);
776int QInputDialog::intValue()
const
778 Q_D(
const QInputDialog);
780 return d->intSpinBox->value();
787
788
789
790
791
792
793void QInputDialog::setIntMinimum(
int min)
796 d->ensureIntSpinBox();
797 d->intSpinBox->setMinimum(min);
800int QInputDialog::intMinimum()
const
802 Q_D(
const QInputDialog);
804 return d->intSpinBox->minimum();
811
812
813
814
815
816
817void QInputDialog::setIntMaximum(
int max)
820 d->ensureIntSpinBox();
821 d->intSpinBox->setMaximum(max);
824int QInputDialog::intMaximum()
const
826 Q_D(
const QInputDialog);
828 return d->intSpinBox->maximum();
835
836
837
838
839void QInputDialog::setIntRange(
int min,
int max)
842 d->ensureIntSpinBox();
843 d->intSpinBox->setRange(min, max);
847
848
849
850
851
852
853void QInputDialog::setIntStep(
int step)
856 d->ensureIntSpinBox();
857 d->intSpinBox->setSingleStep(step);
860int QInputDialog::intStep()
const
862 Q_D(
const QInputDialog);
864 return d->intSpinBox->singleStep();
871
872
873
874
875
876
877void QInputDialog::setDoubleValue(
double value)
880 setInputMode(DoubleInput);
881 d->doubleSpinBox->setValue(value);
884double QInputDialog::doubleValue()
const
886 Q_D(
const QInputDialog);
887 if (d->doubleSpinBox) {
888 return d->doubleSpinBox->value();
895
896
897
898
899
900
901void QInputDialog::setDoubleMinimum(
double min)
904 d->ensureDoubleSpinBox();
905 d->doubleSpinBox->setMinimum(min);
908double QInputDialog::doubleMinimum()
const
910 Q_D(
const QInputDialog);
911 if (d->doubleSpinBox) {
912 return d->doubleSpinBox->minimum();
919
920
921
922
923
924
925void QInputDialog::setDoubleMaximum(
double max)
928 d->ensureDoubleSpinBox();
929 d->doubleSpinBox->setMaximum(max);
932double QInputDialog::doubleMaximum()
const
934 Q_D(
const QInputDialog);
935 if (d->doubleSpinBox) {
936 return d->doubleSpinBox->maximum();
943
944
945
946
947void QInputDialog::setDoubleRange(
double min,
double max)
950 d->ensureDoubleSpinBox();
951 d->doubleSpinBox->setRange(min, max);
955
956
957
958
959
960
961void QInputDialog::setDoubleDecimals(
int decimals)
964 d->ensureDoubleSpinBox();
965 d->doubleSpinBox->setDecimals(decimals);
968int QInputDialog::doubleDecimals()
const
970 Q_D(
const QInputDialog);
971 if (d->doubleSpinBox) {
972 return d->doubleSpinBox->decimals();
979
980
981
982
983void QInputDialog::setOkButtonText(
const QString &text)
985 Q_D(
const QInputDialog);
987 d->buttonBox->button(QDialogButtonBox::Ok)->setText(text);
990QString QInputDialog::okButtonText()
const
992 Q_D(
const QInputDialog);
994 return d->buttonBox->button(QDialogButtonBox::Ok)->text();
998
999
1000
1001void QInputDialog::setCancelButtonText(
const QString &text)
1003 Q_D(
const QInputDialog);
1005 d->buttonBox->button(QDialogButtonBox::Cancel)->setText(text);
1008QString QInputDialog::cancelButtonText()
const
1010 Q_D(
const QInputDialog);
1012 return d->buttonBox->button(QDialogButtonBox::Cancel)->text();
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029void QInputDialog::open(QObject *receiver,
const char *member)
1032 connect(
this, signalForMember(member), receiver, member);
1033 d->receiverToDisconnectOnClose = receiver;
1034 d->memberToDisconnectOnClose = member;
1039
1040
1041QSize QInputDialog::minimumSizeHint()
const
1043 Q_D(
const QInputDialog);
1045 return QDialog::minimumSizeHint();
1049
1050
1051QSize QInputDialog::sizeHint()
const
1053 Q_D(
const QInputDialog);
1055 return QDialog::sizeHint();
1059
1060
1061void QInputDialog::setVisible(
bool visible)
1063 Q_D(
const QInputDialog);
1066 d->inputWidget->setFocus();
1067 if (d->inputWidget == d->lineEdit) {
1068 d->lineEdit->selectAll();
1069 }
else if (d->inputWidget == d->plainTextEdit) {
1070 d->plainTextEdit->selectAll();
1071 }
else if (d->inputWidget == d->intSpinBox) {
1072 d->intSpinBox->selectAll();
1073 }
else if (d->inputWidget == d->doubleSpinBox) {
1074 d->doubleSpinBox->selectAll();
1077 QDialog::setVisible(visible);
1081
1082
1083
1084
1085
1086
1087void QInputDialog::done(
int result)
1090 QDialog::done(result);
1092 InputMode mode = inputMode();
1095 emit doubleValueSelected(doubleValue());
1098 emit intValueSelected(intValue());
1101 Q_ASSERT(mode == TextInput);
1102 emit textValueSelected(textValue());
1105 if (d->receiverToDisconnectOnClose) {
1106 disconnect(
this, signalForMember(d->memberToDisconnectOnClose),
1107 d->receiverToDisconnectOnClose, d->memberToDisconnectOnClose);
1108 d->receiverToDisconnectOnClose =
nullptr;
1110 d->memberToDisconnectOnClose.clear();
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1139QString QInputDialog::getText(QWidget *parent,
const QString &title,
const QString &label,
1140 QLineEdit::EchoMode mode,
const QString &text,
bool *ok,
1141 Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
1143 QAutoPointer<QInputDialog> dialog(
new QInputDialog(parent, flags));
1144 dialog->setWindowTitle(title);
1145 dialog->setLabelText(label);
1146 dialog->setTextValue(text);
1147 dialog->setTextEchoMode(mode);
1148 dialog->setInputMethodHints(inputMethodHints);
1150 const int ret = dialog->exec();
1153 if (
bool(dialog) && ret) {
1154 return dialog->textValue();
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1187QString QInputDialog::getMultiLineText(QWidget *parent,
const QString &title,
const QString &label,
1188 const QString &text,
bool *ok, Qt::WindowFlags flags,
1189 Qt::InputMethodHints inputMethodHints)
1191 QAutoPointer<QInputDialog> dialog(
new QInputDialog(parent, flags));
1192 dialog->setOptions(QInputDialog::UsePlainTextEditForTextInput);
1193 dialog->setWindowTitle(title);
1194 dialog->setLabelText(label);
1195 dialog->setTextValue(text);
1196 dialog->setInputMethodHints(inputMethodHints);
1198 const int ret = dialog->exec();
1201 if (
bool(dialog) && ret) {
1202 return dialog->textValue();
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1233int QInputDialog::getInt(QWidget *parent,
const QString &title,
const QString &label,
int value,
1234 int min,
int max,
int step,
bool *ok, Qt::WindowFlags flags)
1236 QAutoPointer<QInputDialog> dialog(
new QInputDialog(parent, flags));
1237 dialog->setWindowTitle(title);
1238 dialog->setLabelText(label);
1239 dialog->setIntRange(min, max);
1240 dialog->setIntValue(value);
1241 dialog->setIntStep(step);
1243 const int ret = dialog->exec();
1246 if (
bool(dialog) && ret) {
1247 return dialog->intValue();
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1280double QInputDialog::getDouble(QWidget *parent,
const QString &title,
const QString &label,
1281 double value,
double min,
double max,
int decimals,
bool *ok,
1282 Qt::WindowFlags flags,
double step)
1284 QAutoPointer<QInputDialog> dialog(
new QInputDialog(parent, flags));
1285 dialog->setWindowTitle(title);
1286 dialog->setLabelText(label);
1287 dialog->setDoubleDecimals(decimals);
1288 dialog->setDoubleRange(min, max);
1289 dialog->setDoubleValue(value);
1290 dialog->setDoubleStep(step);
1292 const int ret = dialog->exec();
1295 if (
bool(dialog) && ret) {
1296 return dialog->doubleValue();
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1331QString QInputDialog::getItem(QWidget *parent,
const QString &title,
const QString &label,
1332 const QStringList &items,
int current,
bool editable,
bool *ok,
1333 Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
1335 QString text(items.value(current));
1337 QAutoPointer<QInputDialog> dialog(
new QInputDialog(parent, flags));
1338 dialog->setWindowTitle(title);
1339 dialog->setLabelText(label);
1340 dialog->setComboBoxItems(items);
1341 dialog->setTextValue(text);
1342 dialog->setComboBoxEditable(editable);
1343 dialog->setInputMethodHints(inputMethodHints);
1345 const int ret = dialog->exec();
1348 if (
bool(dialog) && ret) {
1349 return dialog->textValue();
1356
1357
1358
1359
1360
1361
1362
1364void QInputDialog::setDoubleStep(
double step)
1367 d->ensureDoubleSpinBox();
1368 d->doubleSpinBox->setSingleStep(step);
1371double QInputDialog::doubleStep()
const
1373 Q_D(
const QInputDialog);
1374 if (d->doubleSpinBox)
1375 return d->doubleSpinBox->singleStep();
1381
1382
1383
1384
1385
1386
1387
1388
1391
1392
1393
1394
1395
1396
1397
1398
1399
1402
1403
1404
1405
1406
1407
1408
1409
1412
1413
1414
1415
1416
1417
1418
1419
1420
1423
1424
1425
1426
1427
1428
1429
1430
1433
1434
1435
1436
1437
1438
1439
1440
1441
1445#include "qinputdialog.moc"
1446#include "moc_qinputdialog.cpp"