#c #qt #widget
#c #qt #виджет
Вопрос:
Согласно моему пониманию документации API QDateEdit, он создает виджет для редактирования дат. Единственными общедоступными элементами, которые у него есть, являются конструкторы. Итак, я в основном создал приложение QT widgets с помощью QT Creator и добавил следующий код.
QTextStream cout(stdout);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDate d1(2002,4,1)
QDateEdit dateEdit(d1,0);
return EXIT_SUCCESS;
}
Даже если ошибка не выдается, виджет / окно также не отображается. Чего я не понимаю?
Ответ №1:
вызовите метод show
dateEdit.show();
это необходимо, потому что QDateEdit является виджетом и не будет отображаться по умолчанию…
просто сделайте:
QDateEdit dateEdit(d1,0);
dateEdit.show();
Редактировать:
к вашему комментарию, дополнительный вопрос;
Почему строка типа QString = InputDialog::getText(….) не требует .show()
ну, функция getText вызывает это внутренне:
документация: https://doc.qt.io/archives/qt-4.8/qdialog.html#exec
int QDialog::exec()
Показывает диалоговое окно как модальное диалоговое окно, блокирующееся до тех пор, пока пользователь не закроет его. Функция возвращает результат диалогового кода.
Если диалоговое окно является модальным для приложения, пользователи не могут взаимодействовать с любым другим окном в том же приложении, пока не закроют диалоговое окно. Если диалоговое окно является модальным, то при открытии диалогового окна блокируется только взаимодействие с родительским окном. По умолчанию диалоговое окно является модальным для приложения.
Смотрите также open(), show(), result() и setWindowModality().
исходный код:
QString QInputDialog::getText(QWidget *parent, const QString amp;title, const QString amp;label,
QLineEdit::EchoMode mode, const QString amp;text, bool *ok,
Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
{
QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
dialog->setWindowTitle(title);
dialog->setLabelText(label);
dialog->setTextValue(text);
dialog->setTextEchoMode(mode);
dialog->setInputMethodHints(inputMethodHints);
const int ret = dialog->exec(); // <== here!!!!
if (ok)
*ok = !!ret;
if (ret) {
return dialog->textValue();
} else {
return QString();
}
}
Комментарии:
1. Спасибо. Почему строка типа QString = InputDialog::getText(….) не требует функции .show() для ее отображения, но QDateEdit это делает?
Ответ №2:
Попробуйте это:
#include <QApplication>
#include <QDate>
#include <QDateEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDate d1(2002,4,1);
QDateEdit dateEdit(d1,0);
dateEdit.show(); // Call show()
return a.exec(); // Run events loop
}
Комментарии:
1. Спасибо. Почему строка типа QString = InputDialog::getText(….) не требует функции .show() для ее отображения, но QDateEdit это делает?
Ответ №3:
Вы создаете виджет, но не вызываете соответствующий метод для его отображения. В Qt для этого есть специальный метод QWidget::show()
. Согласно документам, этот метод:
Показывает виджет и его дочерние виджеты.
В качестве альтернативы вы можете вызвать showFullScreen
, showMaximized
или setVisible(true)
.
Итак, попробуйте:
QDate d1(2002,4,1);
QDateEdit dateEdit(d1,0);
dateEdit.show();
Комментарии:
1. Спасибо. Почему строка типа QString = InputDialog::getText(….) не требует функции .show() для ее отображения, но QDateEdit это делает?