2016-07-06 84 views
1

我有按钮的工具栏:撤销,重做,剪切,复制,粘贴,象下面这样:QT编辑智能按钮

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. 出于某种原因,我需要禁用所有按钮一段时间。在此之后,我想启用所有按钮。但是,当我启用时,根据自己的情况启用/禁用每个按钮(例如,撤消按钮仅在需要撤消的情况下才能启用,只有在存在可以粘贴的文本时才启用粘贴按钮... )

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

回答

2

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

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

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

例如:

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

// 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() 

再后来在你槽:

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. 
} 

要禁用/ renable一次所有的按钮,禁用父对象来代替。

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。我没有测试过这段代码。阅读文档。祝你好运。