0

我是 C++/Qt 的新手,而且我只有一些 Web 开发经验。

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

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

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

我正在尝试这样的事情:

无效记事本::on_actionNew_triggered()
{
    //没有得到正确的测试条件!

    如果(................................) {

    QMessageBox 消息框;
    msgBox.setText("警告!");
    msgBox.setInformativeText("更改已应用于此文档。");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        开关(ret){
            案例 QMessageBox::Discard:
                // 不保存被点击
                ui->textEdit->clear();
                休息;
            案例 QMessageBox::取消:
                msgBox.close();
                休息;
            默认:
                // 永远不应该到达
                休息;
        }
    }else{ui->textEdit->clear();}
}

我已经尝试搜索有关此的一些信息,并且我敢打赌,你们中的大多数人实际上可能认为这很明显,但是我在理解如何解决这个问题时遇到了真正的麻烦。

4

2 回答 2

1

所以,你在这里有一些事情要做。一种是当您单击时,New您需要执行检查以查看是否存在尚未保存的文档,您只需考虑信号和插槽即可。

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

如果您遇到编译问题,请复制任何与您的代码无关的信息并将其粘贴到 Google。很可能有人会问同样的问题,很可能是关于 SO 本身。

于 2013-04-16T14:39:19.717 回答
0

所以,我试图解决这个问题,我决定在 textEdit 发生变化时创建一个返回布尔值的插槽。正如我所知道的,每当触发“新操作”时,我都想将其用作测试。因此,在测试之后,我将 bool 值设置回 false 并且它工作正常:

无效记事本::on_actionNew_triggered()
{    
    如果(记事本::on_textEdit_textChanged()){
    ~记事本::on_textEdit_textChanged();
    QMessageBox 消息框;
    msgBox.setText("警告!");
    msgBox.setInformativeText("更改已应用于此文档。");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        开关(ret){
            案例 QMessageBox::Discard:
                // 不保存被点击
                ui->textEdit->clear();
                休息;
            案例 QMessageBox::取消:
                msgBox.close();
                休息;
            默认:
                // 永远不应该到达
                休息;
        }
    }else{ui->textEdit->clear();}
}

布尔记事本::on_textEdit_textChanged()
{
    返回真;
}
于 2013-04-17T09:01:28.190 回答