Qt对话框接受并拒绝

时间:2015-09-04 09:50:31

标签: qt checkbox textbox dialog

我尝试实现以下内容:单击特定按钮时,会出现一个新对话框,用户必须输入一些信息并选中/取消选中某些复选框。然后用户可以点击"确定"或"取消"。

如果他点击" OK"检查他输入的信息的正确性。如果某些内容不正确,对话框应再次出现并显示警告消息,用户应更正/重新输入信息。我想要存储用户输入的信息。因此,如果信息不正确,则对话框不应该重置"到初始状态但保留用户输入的信息。

如果用户点击"取消"一些标准值被进一步使用。

我几乎得到了一个解决方案,但它无法正常工作。使用我的解决方案时:当我输入错误的信息并点击" OK"出现警告并存储信息,我可以编辑它。但如果我再次输入错误信息并点击" OK"再次,接受错误的信息。请参阅下面的代码。

QDialog dialog(this);
QFormLayout form(&dialog);

form.addRow((new QLabel("Please enter the three questions for the P835 test. \n"
                        "Questions one and two will be permuted, \n "
                        "question three will not. Below each question enter \n"
                        "the rating scale starting with the best rating and \n"
                        "separate the ratings with a comma.")));
QList<QLineEdit *> fields;

    QLineEdit *lineEdit_Q1 = new QLineEdit(&dialog);
    lineEdit_Q1->setText("Bitte bewerten Sie die Signalqualität!");
    QString label_Q1 = QString("First question:");
    form.addRow(label_Q1, lineEdit_Q1);
    fields << lineEdit_Q1;

    QLineEdit *lineEdit_Q1_answer = new QLineEdit(&dialog);
    lineEdit_Q1_answer->setText("nicht verzerrt, leicht verzerrt, etwas verzerrt, ziemlich verzerrt, sehr verzerrt");
    QString label_Q1_answer = QString("Rating first question:");
    form.addRow(label_Q1_answer, lineEdit_Q1_answer);
    fields << lineEdit_Q1_answer;

QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
    form.addRow(&buttonBox);
    QObject::connect(&buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept()));
    QObject::connect(&buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject()));
    bool click = true;
    int code = dialog.exec();
    bool passed = true;
    while (click == true){
        passed = true;
        if (code == QDialog::Accepted) {
        // check if empty questions were entered
        if (lineEdit_Q1->text() == "" || lineEdit_Q2->text() == "" || lineEdit_Q3->text() == "") {
            QMessageBox msgBox;
            msgBox.setText("An error occured while entering questions for the P835 test");
            msgBox.setInformativeText("You can not enter empty questions! Please try again or click cancel to use the standard questions!");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.exec();
            passed = false;
            dialog.close();
            dialog.exec();
            break;
        }
        if (lineEdit_Q1_answer->text().split(",").size() != 5 || lineEdit_Q2_answer->text().split(",").size() != 5 || lineEdit_Q3_answer->text().split(",").size() != 5) {
            QMessageBox msgBox;
            msgBox.setText("An error occured while entering question ratings for the P835 test");
            msgBox.setInformativeText("You have to enter exactly 5 ratings for each question! Please try again or click cancel to use the standard ratings!");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.exec();
            passed = false;
            dialog.close();
            dialog.exec();
            break;
        }
        if (oneFileCheckBox->isChecked() && multipleFilesCheckBox->isChecked()) {
            QMessageBox msgBox;
            msgBox.setText("An error occured while setting up the P835 test...");
            msgBox.setInformativeText("You cannot check both boxes! Please select only one option for the files!");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.exec();
            passed = false;
            dialog.close();
            dialog.exec();
            break;
        }
        if (oneFileCheckBox->isChecked() == false && multipleFilesCheckBox->isChecked() == false) {
            QMessageBox msgBox;
            msgBox.setText("An error occured while setting up the P835 test...");
            msgBox.setInformativeText("You have to select one file option!");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.exec();
            passed = false;
            dialog.close();
            dialog.exec();
            break;
        }
        if (passed == true) {
            this->configMgr->setQuestions(lineEdit_Q1->text(), lineEdit_Q2->text(), lineEdit_Q3->text());
            this->configMgr->setAnswers(lineEdit_Q1_answer->text(), lineEdit_Q2_answer->text(), lineEdit_Q3_answer->text());
            if(oneFileCheckBox->isChecked() == true) {
                this->configMgr->fileOption = 0;
            }
            if(multipleFilesCheckBox->isChecked() == true) {
                this->configMgr->fileOption = 1;
            }
            QMessageBox msgBox;
            msgBox.setText("Success!");
            msgBox.setInformativeText("The questions and the question ratings have been set successfully!");
            msgBox.setIcon(QMessageBox::Information);
            msgBox.exec();
            dialog.close();
            click = false;
        }
        if (code == QDialog::Rejected) {
            this->configMgr->setQuestions(Q1_std, Q2_std, Q3_std);
            this->configMgr->setAnswers(Q1_std_answer, Q2_std_answer, Q3_std_answer);
            QMessageBox msgBox;
            msgBox.setText("Setting standard values...");
            msgBox.setInformativeText("Standard questions and ratings will be set. Click on the P835 button again to set questions and ratings manually!");
            msgBox.setIcon(QMessageBox::Information);
            msgBox.exec();
            dialog.close();
            click = false;
        }
        }
        if (code == QDialog::Rejected) {
            this->configMgr->setQuestions(Q1_std, Q2_std, Q3_std);
            this->configMgr->setAnswers(Q1_std_answer, Q2_std_answer, Q3_std_answer);
            QMessageBox msgBox;
            msgBox.setText("Setting standard values...");
            msgBox.setInformativeText("Standard questions and ratings will be set. Click on the P835 button again to set questions and ratings manually!");
            msgBox.setIcon(QMessageBox::Information);
            msgBox.exec();
            dialog.close();
            click = false;
        }
    }

在这个示例代码中,我只放了一个文本框,用户必须在其中输入一些信息。我有六个文本框和两个复选框。

我希望你能帮助我!谢谢!

1 个答案:

答案 0 :(得分:2)

您应该使用QDialog::done(int r)QWizard进行验证。如果你花时间研究它上面的例子和文档,Qt使这个任务相对容易,但是第一次学习它确实需要时间。

使用QDialog::done(int r)

进行验证

http://www.qtcentre.org/threads/8048-Validate-Data-in-QDialog

void DataSourceDlg::done(int r)
{
    if(QDialog::Accepted == r)  // ok was pressed
    {
        if(nodeLineEdit->text().size() > 3)   // validate the data somehow
        {
            QDialog::done(r);
            return;
        }
        else
        {
            statusBar->setText("Invalid data in text edit...try again...");
            return;
        }
    }
    else    // cancel, close or exc was pressed
    {
        QDialog::done(r);
        return;
    }
}

请注意,通过继承QDialog并管理done方法,您可以阻止对话框关闭并显示消息。

QWizardQWizardPage

http://doc.qt.io/qt-5/qwizard.html#details

使用QWizard是一项更多的工作,但它是围绕验证建立的,并确保正确的信息在正确的方框中。

基本上你是QWizard和QWizard页面的子类,然后你实现了validatePage()和其他一些方法,你可以按照这些例子进行操作,它可以完美地运行。这曾经被包含在Qt解决方案中,并在几年前开放。

http://doc.qt.io/qt-5/qtwidgets-dialogs-classwizard-example.html

http://doc.qt.io/qt-5/qtwidgets-dialogs-licensewizard-example.html

companyLabel = new QLabel(tr("&Company name:"));
companyLineEdit = new QLineEdit;
companyLabel->setBuddy(companyLineEdit);

emailLabel = new QLabel(tr("&Email address:"));
emailLineEdit = new QLineEdit;
emailLineEdit->setValidator(new QRegExpValidator(QRegExp(".*@.*"), this));
emailLabel->setBuddy(emailLineEdit);

postalLabel = new QLabel(tr("&Postal address:"));
postalLineEdit = new QLineEdit;
postalLabel->setBuddy(postalLineEdit);

registerField("details.company*", companyLineEdit);
registerField("details.email*", emailLineEdit);
registerField("details.postal*", postalLineEdit);

*强制要求字段。 QRegExpValidator确保电子邮件地址中间有@个符号。

QValidator QLineEdit

http://doc.qt.io/qt-5/qvalidator.html#details

http://doc.qt.io/qt-5/qtwidgets-widgets-lineedits-example.html

    validatorLineEdit->setValidator(new QIntValidator(
        validatorLineEdit));

    validatorLineEdit->setValidator(new QDoubleValidator(-999.0,
        999.0, 2, validatorLineEdit));

QLineEdit::setInputMask(QString)

http://doc.qt.io/qt-5/qlineedit.html#inputMask-prop

    inputMaskLineEdit->setInputMask("");

    inputMaskLineEdit->setInputMask("+99 99 99 99 99;_");

    inputMaskLineEdit->setInputMask("0000-00-00");
    inputMaskLineEdit->setText("00000000");
    inputMaskLineEdit->setCursorPosition(0);

    inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");

正则表达式

RegEx太棒了。学习它非常有用(恕我直言)。我非常喜欢gskinner提供的工具和备忘单。 http://regexr.com/

http://doc.qt.io/qt-5/qregexpvalidator.html#details

// regexp: optional '-' followed by between 1 and 3 digits
QRegExp rx("-?\\d{1,3}");
QValidator *validator = new QRegExpValidator(rx, this);

QLineEdit *edit = new QLineEdit(this);
edit->setValidator(validator);

希望有所帮助。