1、文本编辑组件
Qt 中支持三种常用的文本编辑组件
— QLineEdit
: 单行文本编辑组件
— QTextEdit
: 多行富文本编辑组件
— QPlainTextEdit
: 多行普通文本编辑组件
Qt 中常用文本编辑组件的继承层次图
不同文本组件的特性比较
Qt 中常用文本编辑组件的内置功能
文本编辑组件初体验:
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include
#include
#include
#include class MainWindow : public QMainWindow
{Q_OBJECT
private:QLineEdit edit;QPlainTextEdit plainedit;QTextEdit textedit;public:MainWindow(QWidget *parent = nullptr);~MainWindow();
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), edit(this), plainedit(this), textedit(this)
{resize(600, 450);edit.move(20, 20);edit.resize(480, 120);edit.insert("QLineEdit");edit.insert("\n");edit.insert("
");plainedit.move(20, 150);plainedit.resize(480, 120);plainedit.insertPlainText("QLineEdit");plainedit.insertPlainText("\n");plainedit.insertPlainText("
");textedit.move(20, 280);textedit.resize(480, 120);textedit.insertPlainText("QLineEdit");textedit.insertPlainText("\n");textedit.insertHtml("
");
}MainWindow::~MainWindow()
{
}
main.cpp
#include "MainWindow.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
文本编辑器实例:
MainWindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include
#include
#include
#include
#include
#include
#include
#include class MainWindow : public QMainWindow
{Q_OBJECT
private:QPlainTextEdit mainedit;QLabel statusLbl;MainWindow();MainWindow(const MainWindow&);MainWindow& operator= (const MainWindow&);bool construct();bool initMenuBar();bool initToolBar();bool initStatusBar();bool initMainEditor();bool initFileMenu(QMenuBar* mb);bool initEditMenu(QMenuBar* mb);bool initFormatMenu(QMenuBar* mb);bool initViewMenu(QMenuBar* mb);bool initHelpMenu(QMenuBar* mb);bool initFileToolItem(QToolBar* tb);bool initEditToolItem(QToolBar* tb);bool initFormatToolItem(QToolBar* tb);bool initViewToolItem(QToolBar* tb);bool makeAction(QAction*& action, QString text, int key);bool makeAction(QAction*& action, QString tip, QString icon);
public:static MainWindow* NewInstance();~MainWindow();
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"
#include
#include
#include MainWindow::MainWindow()
{resize(500, 400);
}MainWindow* MainWindow::NewInstance()
{MainWindow* ret = new MainWindow();if(!(ret && ret->construct())){delete ret;ret = nullptr;}return ret;
}bool MainWindow::construct()
{bool ret = true;ret = ret && initMenuBar();ret = ret && initToolBar();ret = ret && initStatusBar();ret = ret && initMainEditor();return ret;
}bool MainWindow::initMenuBar()
{QMenuBar* mb = menuBar();bool ret = (mb != nullptr);ret = ret && initFileMenu(mb);ret = ret && initEditMenu(mb);ret = ret && initFormatMenu(mb);ret = ret && initViewMenu(mb);ret = ret && initHelpMenu(mb);return ret;
}bool MainWindow::initToolBar()
{QToolBar* tb = addToolBar("toolbar");bool ret = (tb != nullptr);tb->setIconSize(QSize(16, 16));//tb->setFloatable(false);//tb->setMovable(false);ret = ret && initFileToolItem(tb);ret = ret && initEditToolItem(tb);ret = ret && initFormatToolItem(tb);ret = ret && initViewToolItem(tb);return ret;
}bool MainWindow::initStatusBar()
{QStatusBar* sb = statusBar();bool ret = (sb != nullptr);QLabel* label = new QLabel("xiebs");if((label != nullptr) && ret){ statusLbl.setMinimumWidth(200);statusLbl.setAlignment(Qt::AlignCenter);statusLbl.setText("Ln: 1 Col: 1");label->setMinimumWidth(200); //以像素为单位label->setAlignment(Qt::AlignCenter);sb->addPermanentWidget(new QLabel());sb->addPermanentWidget(&statusLbl);sb->addPermanentWidget(label);}else{ret = false;}return ret;
}bool MainWindow::initMainEditor()
{bool ret = true;mainedit.setParent(this);setCentralWidget(&mainedit);return ret;
}bool MainWindow::initFileMenu(QMenuBar* mb)
{bool ret = true;QMenu* menu = new QMenu("文件(&F)");ret = (menu != nullptr);if(ret){QAction* action = nullptr;ret = ret && makeAction(action, "新建(&N)", Qt::CTRL + Qt::Key_N);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "打开(&O)...", Qt::CTRL + Qt::Key_O);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "保存(&S)", Qt::CTRL + Qt::Key_S);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "另存为(&A)...", 0);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "页面设置(&U)...", 0);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "打印(&P)...", Qt::CTRL + Qt::Key_P);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "退出(&X)...", 0);if(ret){menu->addAction(action);}}if(ret){mb->addMenu(menu);}else{delete menu;ret = false;}return ret;
}bool MainWindow::initEditMenu(QMenuBar* mb)
{bool ret = true;QMenu* menu = new QMenu("编辑(&E)");ret = (menu != nullptr);if(ret){QAction* action = nullptr;ret = ret && makeAction(action, "撤销(&U)", Qt::CTRL + Qt::Key_Z);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "剪切(&T)", Qt::CTRL + Qt::Key_X);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "复制(&C)", Qt::CTRL + Qt::Key_C);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "粘贴(&P)", Qt::CTRL + Qt::Key_V);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "删除(&L)", Qt::Key_Delete);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "查找(&F)...", Qt::CTRL + Qt::Key_F);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "查找下一个(&N)", Qt::Key_F3);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "替换(&R)...", Qt::CTRL + Qt::Key_H);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "转到(&G)...", Qt::CTRL + Qt::Key_G);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "全选(&A)", Qt::CTRL + Qt::Key_A);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "时间/日期(&D)...", Qt::Key_F5);if(ret){menu->addAction(action);}}if(ret){mb->addMenu(menu);}else{delete menu;ret = false;}return ret;
}bool MainWindow::initFormatMenu(QMenuBar* mb)
{bool ret = true;QMenu* menu = new QMenu("格式(&O)");ret = (menu != nullptr);if(ret){QAction* action = nullptr;ret = ret && makeAction(action, "自动换行(&W)", 0);if(ret){menu->addAction(action);}ret = ret && makeAction(action, "字体(&F)...", 0);if(ret){menu->addAction(action);}}if(ret){mb->addMenu(menu);}else{delete menu;ret = false;}return ret;
}bool MainWindow::initViewMenu(QMenuBar* mb)
{bool ret = true;QMenu* menu = new QMenu("查看(&V)");ret = (menu != nullptr);if(ret){QAction* action = nullptr;ret = ret && makeAction(action, "工具栏(&T)", 0);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "状态栏(&S)", 0);if(ret){menu->addAction(action);}}if(ret){mb->addMenu(menu);}else{delete menu;ret = false;}return ret;
}bool MainWindow::initHelpMenu(QMenuBar* mb)
{bool ret = true;QMenu* menu = new QMenu("帮助(&H)");ret = (menu != nullptr);if(ret){QAction* action = nullptr;ret = ret && makeAction(action, "查看帮助(&H)", 0);if(ret){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, "关于记事本(&A)", 0);if(ret){menu->addAction(action);}}if(ret){mb->addMenu(menu);}else{delete menu;ret = false;}return ret;
}bool MainWindow::initFileToolItem(QToolBar* tb)
{bool ret = true;QAction* action = nullptr;ret = ret && makeAction(action, "新建", ":/Res/pic/new.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "打开", ":/Res/pic/open.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "保存", ":/Res/pic/save.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "保存到", ":/Res/pic/saveas.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "打印", ":/Res/pic/print.png");if(ret){tb->addAction(action);}tb->addSeparator();return ret;
}bool MainWindow::initEditToolItem(QToolBar* tb)
{bool ret = true;QAction* action = nullptr;ret = ret && makeAction(action, "返回", ":/Res/pic/redo.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "撤销", ":/Res/pic/undo.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "剪切", ":/Res/pic/cut.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "复制", ":/Res/pic/copy.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "粘贴", ":/Res/pic/paste.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "查找", ":/Res/pic/find.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "替换", ":/Res/pic/replace.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "转到", ":/Res/pic/goto.png");if(ret){tb->addAction(action);}tb->addSeparator();return ret;
}bool MainWindow::initFormatToolItem(QToolBar* tb)
{bool ret = true;QAction* action = nullptr;ret = ret && makeAction(action, "自动换行", ":/Res/pic/wrap.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "字体", ":/Res/pic/font.png");if(ret){tb->addAction(action);}tb->addSeparator();return ret;
}bool MainWindow::initViewToolItem(QToolBar* tb)
{bool ret = true;QAction* action = nullptr;ret = ret && makeAction(action, "工具栏", ":/Res/pic/tool.png");if(ret){tb->addAction(action);}ret = ret && makeAction(action, "状态栏", ":/Res/pic/status.png");if(ret){tb->addAction(action);}return ret;
}bool MainWindow::makeAction(QAction*& action, QString text, int key)
{bool ret = true;action = new QAction(text, nullptr);if(action != nullptr){action->setShortcut(QKeySequence(key));}else{ret = false;}return ret;
}bool MainWindow::makeAction(QAction*& action, QString tip, QString icon)
{action = new QAction("", nullptr);bool ret = (action != nullptr);if(ret){action->setToolTip(tip);action->setIcon(QIcon(icon));}return ret;
}MainWindow::~MainWindow()
{
}
main.cpp
#include "MainWindow.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);int ret = 0;MainWindow* w = MainWindow::NewInstance();if(w != nullptr){w->show();ret = a.exec();}delete w;return ret;
}
小结:
QLineEdit
用于单行简单文本输入的情形QPlainTextEdit
用于多行简单文本输入的情形QTextEdit
用于多行富文本输入的情形
上一篇:第一讲 递推与递归