首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT编辑器智能按钮

QT编辑器智能按钮
EN

Stack Overflow用户
提问于 2016-07-06 15:46:53
回答 1查看 75关注 0票数 1

我有一个带有按钮的工具栏:撤消、重做、剪切、复制、粘贴,如下所示:

代码语言:javascript
复制
editmenu = menuBar()->addMenu(QObject::tr("&Edit"));
undoact = editmenu->addAction(QIcon(":images/undo.png"), QObject::tr("&Undo"));
QObject::connect(editwin, SIGNAL(undoAvailable(bool)), undoact, SLOT(setEnabled(bool)));
QObject::connect(undoact, SIGNAL(triggered()), editwin, SLOT(undo()));
undoact->setShortcuts(QKeySequence::keyBindings(QKeySequence::Undo));
undoact->setEnabled(false);
redoact = editmenu->addAction(QIcon(":images/redo.png"), QObject::tr("&Redo"));
QObject::connect(editwin, SIGNAL(redoAvailable(bool)), redoact, SLOT(setEnabled(bool)));
QObject::connect(redoact, SIGNAL(triggered()), editwin, SLOT(redo()));
redoact->setShortcuts(QKeySequence::keyBindings(QKeySequence::Redo));
redoact->setEnabled(false);
editmenu->addSeparator();
cutact = editmenu->addAction(QIcon(":images/cut.png"), QObject::tr("Cu&t"));
cutact->setShortcuts(QKeySequence::keyBindings(QKeySequence::Cut));
cutact->setEnabled(false);
copyact = editmenu->addAction(QIcon(":images/copy.png"), QObject::tr("&Copy"));
copyact->setShortcuts(QKeySequence::keyBindings(QKeySequence::Copy));
copyact->setEnabled(false);
pasteact = editmenu->addAction(QIcon(":images/paste.png"), QObject::tr("&Paste"));
pasteact->setShortcuts(QKeySequence::keyBindings(QKeySequence::Paste));

我要:

  1. 只有当剪贴板包含文本时才启用“粘贴”按钮
  2. 由于某些原因,我需要禁用所有的按钮一段有限的时间。在此之后,我想启用所有按钮。但当我启用时,每个按钮将根据他的情况启用/禁用(例如。只有当有要撤消的内容时才启用撤消按钮,只有当有可以粘贴的文本时才启用粘贴按钮.)

你建议我怎么做?最聪明/最简单的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-07-06 16:31:38

http://doc.qt.io/qt-5/qclipboard.html#signals

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

创建从QClipboard对象到工具栏/主窗口类中的处理程序槽的连接。然后,在处理程序槽中,执行希望发生在工具栏按钮上的逻辑。

例如:

http://doc.qt.io/qt-5/qclipboard.html#dataChanged

代码语言:javascript
复制
// in your constructor after creating your buttons:
QObject::connect(qApp->clipboard(), SIGNAL(dataChanged()), 
    this, SLOT(onClipboardDataChanged()));

// and then make another connection for the other relevant clipboard signal...
// selectionChanged()

然后在后面的插槽里:

代码语言:javascript
复制
void MainWindow::onClipboardDataChanged()
{
     const QClipboard *clipboard = QApplication::clipboard();
     const QMimeData *mimeData = clipboard->mimeData();

     pasteact->setEnabled(mimeData->hasText());
     // or you could check the length of the text to see if it is non zero.
}

若要同时禁用/重命名所有按钮,请禁用父对象。

代码语言:javascript
复制
editToolbar->setEnabled(false);
//... after some period of time or transactions...
editToolbar->setEnabled(true);

但这可能不会禁用内置加速器的复制,剪切和粘贴。要想关闭这些键盘快捷键,您可能需要在应用程序上设置一个事件过滤器。

http://doc.qt.io/qt-5/accelerators.html

http://doc.qt.io/qt-5/qobject.html#eventFilter

http://doc.qt.io/qt-5/qobject.html#installEventFilter

希望这能有所帮助。

PS。我还没测试过这段代码。读读医生。祝好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38228211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档