关于QTextEdit的插槽/信号动态

时间:2013-04-16 14:10:44

标签: qt signals-slots qtextedit textchanged

我在C ++ / Qt上相当新,我只有一些Web开发经验。

我正在用Qt测试一些用于学习目的的东西,而且我对它的失败很惨。我很确定这是因为整个插槽/信号还没有解决,所以我希望有人能让我更清楚。

所以,我有这个主程序UI,我放置了一个QTextEdit小部件。现在我正在尝试重现其中一个“文档有更改,更好地保存它!” - 警告,并且每次有人试图创建新文档时都会显示它。

我正在尝试在触发“新建文档”选项时测试textEdit小部件中的更改。我一直收到这些编译错误,我甚至都不知道它们是什么意思!什么是正确的测试条件?我如何引用textEdit,因为它在其他地方被调用?

我正在尝试这样的事情:

void Notepad::on_actionNew_triggered()
{
    //not getting the test condition right!

    if(................................) {

    QMessageBox msgBox;
    msgBox.setText("Warning!");
    msgBox.setInformativeText("Changes were applied to this document.");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        switch (ret) {
            case QMessageBox::Discard:
                // Don't Save was clicked
                ui->textEdit->clear();
                break;
            case QMessageBox::Cancel:
                msgBox.close();
                break;
            default:
                // should never be reached
                break;
        }
    }else{ui->textEdit->clear();}
}

我试过搜索一些关于此的信息,我打赌你们大多数人可能会认为这很明显,但我真的很难理解如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

所以,你在这里玩了一些东西。一个是当你点击New时,你需要检查是否存在尚未保存的文件,你可以考虑信号和插槽。

因此,当您按New时需要向文档发送信号,如果您已创建自定义类,则这很容易,因为您可以添加新的广告位dirtyDocument(例如!)它可以将文档状态转发回来,例如通过发出包含bool标志的另一个信号并在另一个槽内处理它。或者,在您的on_actionNew_triggered插槽中,您可以通过传递对象的引用或者保持对它的类引用来询问当前打开的文档对象是否有未保存的更改(这就是您有{{1}的地方在你的notepad.h文件中)。

如果您收到编译问题,请复制任何没有特定代码的信息并将其粘贴到Google中。很可能有人会问同样的问题,很可能就是SO本身。

答案 1 :(得分:0)

所以,我试图解决这个问题,每当textEdit遭遇更改时,我决定让一个槽返回一个bool值。正如我想的那样,每当触发“新动作”时,我都会考虑将其用作测试。因此,在测试之后,我将bool值设置为false并且它正常工作:

void Notepad::on_actionNew_triggered()
{    
    if(Notepad::on_textEdit_textChanged()) {
    ~Notepad::on_textEdit_textChanged(); 
    QMessageBox msgBox;
    msgBox.setText("Warning!");
    msgBox.setInformativeText("Changes were applied to this document.");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        switch (ret) {
            case QMessageBox::Discard:
                // Don't Save was clicked
                ui->textEdit->clear();
                break;
            case QMessageBox::Cancel:
                msgBox.close();
                break;
            default:
                // should never be reached
                break;
        }
    }else{ui->textEdit->clear();}
}

bool Notepad::on_textEdit_textChanged()
{
    return true;
}