QT-信号和插槽setEnabled(bool)插槽不工作

时间:2018-05-05 06:44:36

标签: c++ qt

我一直在使用QT处理一个简单的记事本应用程序,目前我停留在我必须在撤消或重做不适用时禁用actionUndoactionRedo的地方分别。我使用了QT的连接方法,目前我的constructor function(以及includes)看起来像这样:

#include "notepad.h"
#include "ui_notepad.h"
#include "about.h"
#include <QFile>
#include <QTextStream>
#include <QFileDialog>
#include <QIcon>
#include <QFont>
#include <QFontDialog>
#include <QTextCursor>

Notepad::Notepad(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Notepad)
{
    ui->setupUi(this);
    setWindowTitle("QNotepad");
    setWindowIcon(QIcon(":/icons/icons/qnotepad.png"));
    setCentralWidget(ui->textBody);

    //Enabling the options, only when applicable
    connect(ui->textBody, SIGNAL(undoAvailable(bool)), ui->actionUndo, SLOT(setEnabled(bool)));
    connect(ui->textBody, SIGNAL(redoAvailable(bool)), ui->actionRedo, SLOT(setEnabled(bool)));

}

完整来源为here

但是,当我运行该程序时,它似乎无效,即使没有可用的撤消和重做操作,actionUndoactionRedo仍然处于启用状态。

A screenshot of the problem

我使用Arch Linux作为主要开发环境

1 个答案:

答案 0 :(得分:1)

默认情况下启用Qt Ui元素(窗口小部件,操作等),因此您需要在您的notepad.ui文件的Qt设计器的属性窗口中取消选中Undo和Redo操作的启用标志。 或者你可以在你的窗口的构造函数中这样做:

ui->actionUndo->setEnabled(false);
ui->actionRedo->setEnabled(false);

//Enabling the options, only when applicable
connect(ui->textBody, &QTextEdit::undoAvailable, ui->actionUndo, &QAction::setEnabled);
connect(ui->textBody, &QTextEdit::undoAvailable, ui->actionRedo, &QAction::setEnabled);

这样,只有当QTextEdit发出信号时,它们才会打开/关闭。

还要考虑使用函数语法进行信号/插槽连接,如我的代码剪辑所示,因为它有几个优点。请参阅here了解详情。