2018.4.26
网上大概翻了一些教程,对比一下发现Qt学习之路2的学习推进方式更适合我一些,为了防止自己遗忘,在这里分享一些学习的要点,我记的知识要点可能偏个人一些,大概率思维会比较跳跃,建议参考博主原文和查看官方API理解。
MainWindow的布局(后面代码会用到):
QAction动作:
Qt 使用QAction类作为动作,该类抽象出了窗口的一个动作,把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
简单文本编辑器实现:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTextEdit> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; void open(); void save(); QAction *openAction; QAction *saveAction; QTextEdit *textEdit; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include <QAction> #include <QMenuBar> #include <QMessageBox> #include <QStatusBar> #include <QToolBar> #include <QTextEdit> #include <QFileDialog> #include <QTextStream> #include "mainwindow.h" #include "ui_mainwindow.h" /* MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } */ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //文本使用tr()函数,这是一个用于 Qt 国际化的函数,tr()函数里面一般会是英文文本 setWindowTitle(tr("Main Window")); //文件打开动作 //QAction第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。 openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this); //使用QT内置QKeySequence类来添加键盘快捷键 openAction -> setShortcuts(QKeySequence::Open); //鼠标滑过时会在主窗口下方的状态栏显示相应的提示 openAction -> setStatusTip(tr("Open an existing file")); //文件保存动作 saveAction = new QAction(QIcon(":/images/doc-save"), tr("&Save..."), this); saveAction->setShortcuts(QKeySequence::Save); saveAction->setStatusTip(tr("Save a new file")); connect(openAction, &QAction::triggered, this, &MainWindow::open); connect(saveAction, &QAction::triggered, this, &MainWindow::save); //创建并返回菜单栏 QMenu *file = menuBar() -> addMenu(tr("&File")); file -> addAction(openAction); file -> addAction(saveAction); //创建并返回工具栏 QToolBar *toolBar = addToolBar(tr("&File")); toolBar -> addAction(openAction); toolBar -> addAction(saveAction); //创建输入栏 textEdit = new QTextEdit(this); //可以将一个组件作为窗口的中心组件,放在窗口中央显示区。 setCentralWidget(textEdit); //创建并返回状态栏 statusBar(); } void MainWindow::open(){ //QFileDialog文件对话框 //QFileDialog::getOpenFileName()返回值是选择的文件路径,参数顺序:父窗口(模态),对话框标题,默认打开目录(.表示当前目录),过滤器 QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); if(!path.isEmpty()){ QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path)); return; } //使用QTextStream::readAll()读取文件所有内容,然后将其赋值给QTextEdit显示出来。最后不要忘记关闭文件。 QTextStream in(&file); //如果数据量过大readAll会直接使程序崩溃 textEdit -> setText(in.readAll()); file.close(); }else{ QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); } } void MainWindow::save(){ QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); if(!path.isEmpty()){ QFile file(path); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){ QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path)); return; } QTextStream out(&file); //将QTextEdit的内容输出到一个文件中 out << textEdit->toPlainText(); file.close(); }else{ QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); } } MainWindow::~MainWindow() { delete ui; }
mian.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
res.qrc
具体添加步骤为:工程-右键-添加新文件-Qt Resource File;(编辑框下方)添加前缀-“/images”-添加文件-“自己准备好的图标.png”-别名-“体现在代码中的名称”(为了方便替换文件后的代码更改)。
若对Resource文件进行了更新,需要重新构建项目-执行qmake-编译-运行,才能看到更新后的效果。
运行效果:
可以进行简单的文件编辑、保存和txt打开显示。