1、编辑交互功能
1.1、
编辑器中常规的编辑交互功能
1.2、
QPlainTextEdit提供了丰富的交互接口
1.3、
信号与槽的连接
2、文本编辑器中的界面状态
2.1、
不是任何时候都可以复制、粘贴、撤销、重做(比如开始没有数据时)
2.2、
QPlainTextEdit能够发送与界面状态相关的信号
2.3、实现步骤(三部曲)
2.3.1、连接界面状态信号到
自定义的槽函数
2.3.2、通过文本信息找到对应的QAction对象。
/************* 通过文本信息找到对应的QAction对象 ******************/
QAction* MainWindow::findMenuBarAction(QString text)//菜单栏的
{
QAction* ret = NULL;
const QObjectList& list = menuBar()->children();//获得菜单栏里面的子组件(list整体)。
for(int i=0; i<list.count(); i++)
{ //因为有父子继承关系,所以用dynamic_cast<>()
QMenu* menu = dynamic_cast<QMenu*>(list[i]);//获得每一个子菜单。
if(menu != NULL)
{
QList<QAction*> actions = menu->actions();//获得子菜单Action?
for(int j=0; j<actions.count(); j++)
{//遍历action对象。
if(actions[j]->text().startsWith(text))
{
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* tb = dynamic_cast<QToolBar*>(list[i]);//只有工具栏能够转换成功。
if(tb != NULL)
{
for(int j=0; j<tb->actions().count(); j++)
{//原来的bug是text()改为toolTip()就没了。
if(tb->actions()[j]->toolTip().startsWith(text))
{
ret = tb->actions()[j];
break;
}
}
}
}
//qDebug() << "22222222222222222222222222";
//qDebug() << text << "qwewqe" << ret;
return ret;
}
3、通过信号标志设置QAction对象的界面状态。
void MainWindow::onCopyAvailable(bool available)
{
QAction* action = findMenuBarAction("Copy");
if(action != NULL)
{
action->setEnabled(available);
}
action = findToolBarAction("Copy");
if(action != NULL)
{
action->setEnabled(available);
}
action = findMenuBarAction("Cut");
if(action != NULL)
{
action->setEnabled(available);
}
action = findToolBarAction("Cut");
if(action != NULL)
{
action->setEnabled(available);
}
//findMenuBarAction("Cut")->setEnabled(available);//,这样不安全。防止为NULL
//findToolBarAction("Cut")->setEnabled(available);
}
void MainWindow::onRedoAvailable(bool available)
{
QAction* action = findMenuBarAction("Redo");
if(action != NULL)
{
action->setEnabled(available);
}
action = findToolBarAction("Redo");
if(action != NULL)
{
action->setEnabled(available);
}
}
void MainWindow::onUndoAvailable(bool available)
{
QAction* action = findMenuBarAction("Undo");
if(action != NULL)
{
action->setEnabled(available);
}
action = findToolBarAction("Undo");
if(action != NULL)
{
action->setEnabled(available);
}
}
4、其他修改的地方:将copy,Cut,Redo,Undo等舒适状态设置为false
3、小结
3.1、
QPlainTextEdit
封装了常用的文本编辑功能
3.2、
可以将信号直接连接到
QPlainTextEdit的公有槽函数
3.3、
界面状态是GUI开发的重点和难点
3.4、
Qt中组件的
状态信号
能够简化界面状态的维护
3.5、
主窗口中的组件
可以通过遍历的方法找回