1、编辑交互功能
编辑器中的常规编辑交互功能
复制(Copy) ,粘贴(Paste), 剪切(Cut), 撒销(Undo) , 重做(Redo), 删除(Delete)
QPlainTextEdit提供了丰富的交互功能接口
信号与槽的连接
2、编程实验
基本编辑功能实现 NotePad.pro
这里的action->setEnabled(false)代表初始界面状态false(即这些action不能操作)
3、文本编辑器中的界面状态
-不是任何时候都能够进行
复制,粘贴
撤销,重做
如何维护文本编辑器的界面状态?
QPlainTextEdit能够发送与界面状态相关的信号
- void copyAvailable(bool yes)
- void redoAvailable(bool available)
- void undoAvailable(bool available)
- void cursorPositionChanged()
实现步骤
1. 连接界面状态信号到自定义槽函数
2. 通过文本信息找到对应的QAction对象
3. 根据信号标志设置QAction对象的界面状态
4、编程实验
界面状态更新 NotePad.pro
MainWindow.h 新增成员函数和槽函数
MainWindowUI.cpp 连接信号与槽
bool MainWindow::initMainEditor()
{
bool ret = true;
mainEditor.setParent(this);
connect(&mainEditor, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
connect(&mainEditor, SIGNAL(copyAvailable(bool)), this, SLOT(onCopyAvailable(bool)));
connect(&mainEditor, SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool)));
connect(&mainEditor, SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool)));
setCentralWidget(&mainEditor);
return ret;
}
MainWindowSlots.cpp的实现新增函数
void MainWindow::onCopyAvailable(bool available)
{
findMenuBarAction("Copy")->setEnabled(available);//根据标志位设置指定action状态
findMenuBarAction("Cut")->setEnabled(available);
findToolBarAction("Copy")->setEnabled(available);
findToolBarAction("Cut")->setEnabled(available);
}
void MainWindow::onRedoAvailable(bool available)
{
findMenuBarAction("Redo")->setEnabled(available);
findToolBarAction("Redo")->setEnabled(available);
}
void MainWindow::onUndoAvailable(bool available)
{
findMenuBarAction("Undo")->setEnabled(available);
findToolBarAction("Undo")->setEnabled(available);
}
QAction* MainWindow::findMenuBarAction(QString text)
{
QAction* ret = NULL;
const QObjectList& list = menuBar()->children();//const QObjectList & QObject::children () const
for(int i=0; i<list.count(); i++)
{
QMenu* menu = dynamic_cast<QMenu*>(list[i]);
if( menu != NULL )
{
QList<QAction*> actions = menu->actions();
for(int j=0; j<actions.count(); j++)
{
if( actions[j]->text().startsWith(text) )//当前的action是所指定的action,找到了,返回
{
ret = actions[j];
break;
}
}
}
}
return ret;
}
QAction* MainWindow::findToolBarAction(QString text)
{
QAction* ret = NULL;
const QObjectList& list = children();//包含了主窗口每一个组件
for(int i=0; i<list.count(); i++)
{
QToolBar* toolBar = dynamic_cast<QToolBar*>(list[i]); //只有一个工具栏组件可以转换成功,其它失败返回NULL
if( toolBar != NULL )//找到了工具栏
{
QList<QAction*> actions = toolBar->actions();
for(int j=0; j<actions.count(); j++)
{
if( actions[j]->toolTip().startsWith(text) )
{
ret = actions[j];
break;
}
}
}
}
return ret;
}
5、小结
QPlainTextEdit封装了常用的文本编辑功能
可以将信号直接连接到QPlainTextEdit的公有槽函数
界面状态是GUI开发的重点和难点
Qt中组件的状态信号能够简化界面状态的维护
主窗口中的组件可以通过遍历的方式找回