QT-window记事本

2024-08-23 06:36
文章标签 qt window 记事本

本文主要是介绍QT-window记事本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QT-window记事本

  • 一、演示效果
  • 二、核心代码
  • 三、下载连接


一、演示效果

请添加图片描述

二、核心代码

#include <QMessageBox>
#include <QFileDialog>
#include <QDebug>
#include <QProcess>
#include <QDesktopServices>
#include <QDateTime>
#include <QFontDialog>
#include <QTextBlock>
#include <QFileIconProvider>
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow),settings("MyNotepad")
{ui->setupUi(this);// 读取设置if (!settings.value("wordWrap", true).toBool()){ui->actionWord_Wrap_W->setChecked(false);ui->plainTextEdit->setWordWrapMode(QTextOption::NoWrap);}if (!settings.value("statusBar", true).toBool()){this->statusBar()->hide();ui->actionStatus_Bar_S->setChecked(false);}// 恢复字体QString fs;if (!(fs = settings.value("font").toString()).isEmpty()){QFont f;f.fromString(fs);ui->plainTextEdit->setFont(f);}// 状态栏posLabel = new QLabel(u8"第 1 行,第 1 列", this);zoomLabel = new QLabel(u8"100%", this);lineLabel = new QLabel(u8"Windows (CRLF)", this);codecLabel = new QLabel(u8"GBK", this);ui->statusbar->addPermanentWidget(new QLabel(this), 6);ui->statusbar->addPermanentWidget(posLabel, 3);ui->statusbar->addPermanentWidget(zoomLabel, 1);ui->statusbar->addPermanentWidget(lineLabel, 3);ui->statusbar->addPermanentWidget(codecLabel, 1);// 设置为系统notepad图标QFileIconProvider ip;QIcon icon = ip.icon(QFileInfo("C:\\Windows\\System32\\notepad.exe"));qApp->setWindowIcon(icon);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::openFile(QString path)
{filePath = path;if (path.isEmpty()){savedContent = "";fileName = u8"无标题";}else{QFile file(path);if (!file.exists()){qWarning() << u8"文件不存在";return ;}fileName = QFileInfo(path).baseName();// 读取文件if (!file.open(QIODevice::ReadOnly)){qWarning() << u8"打开文件失败";return ;}savedContent = QString::fromLocal8Bit(file.readAll());}ui->plainTextEdit->setPlainText(savedContent);updateWindowTitle();
}bool MainWindow::isModified() const
{return ui->plainTextEdit->toPlainText() != savedContent;
}/*** @brief MainWindow::askSave* @return 是否继续*/
bool MainWindow::askSave()
{if (!isModified())return true;// 有未保存的更改int btn = QMessageBox::question(this, u8"记事本", u8"你想更改保存到 " + (fileName.isEmpty() ? u8"无标题" : fileName) + u8" 吗?", u8"保存(&S)", u8"不保存(&N)", u8"取消");if (btn == 2) // 取消return false;if (btn == 0) // 保存{return on_actionSave_triggered();}return true;
}void MainWindow::updateWindowTitle()
{this->setWindowTitle((isModified() ? "*" : "") + fileName + u8" - 记事本");
}void MainWindow::createFindDialog()
{findDialog = new FindDialog(settings, this);connect(findDialog, &FindDialog::signalShow, this, [=]{ui->actionFind_Next_N->setEnabled(true);ui->actionFind_Prev_V->setEnabled(true);});connect(findDialog, &FindDialog::signalHide, this, [=]{ui->actionFind_Next_N->setEnabled(false);ui->actionFind_Prev_V->setEnabled(false);});/* connect(findDialog, &FindDialog::signalTextChanged, this, [=](const QString& text){this->findText = text;}); */connect(findDialog, &FindDialog::signalFindNext, this, &MainWindow::on_actionFind_Next_N_triggered);connect(findDialog, &FindDialog::signalFindPrev, this, &MainWindow::on_actionFind_Prev_V_triggered);connect(findDialog, &FindDialog::signalReplaceNext, this, [=]{const QString& findText = findDialog->getFindText();const QString& replaceText = findDialog->getReplaceText();if (findText.isEmpty())return ;// 替换 逻辑上分为:查找、选中、替换const QString& selectedText = ui->plainTextEdit->textCursor().selectedText();if ((findDialog->isCaseSensitive() && selectedText != findText)|| selectedText.toLower() != findText.toLower()){// 如果选中的词不是findText,则查找下一个on_actionFind_Next_N_triggered();qInfo() << u8"查找:" << findText;}else{// 已选中,则替换选中的QTextCursor tc = ui->plainTextEdit->textCursor();tc.insertText(replaceText);ui->plainTextEdit->setTextCursor(tc);qInfo() << u8"替换:" << findText << "->" << replaceText;on_actionFind_Next_N_triggered(); // 查找下一个}});connect(findDialog, &FindDialog::signalReplaceAll, this, [=]{const QString& findText = findDialog->getFindText();const QString& replaceText = findDialog->getReplaceText();if (findText.isEmpty())return ;qInfo() << u8"全部替换:" << findText << "->" << replaceText;QString content = ui->plainTextEdit->toPlainText();QTextCursor tc = ui->plainTextEdit->textCursor();tc.setPosition(0);tc.setPosition(content.length(), QTextCursor::KeepAnchor);content.replace(findText, replaceText);tc.insertText(content);// ui->plainTextEdit->setTextCursor(tc);     // 不调用这句话,保留替换之前的位置// ui->plainTextEdit->setPlainText(content); // 这个会导致无法撤销,而且会重置光标位置到开头});
}void MainWindow::showEvent(QShowEvent *e)
{this->restoreGeometry(settings.value("mainwindow/geometry").toByteArray());this->restoreState(settings.value("mainwindow/state").toByteArray());QMainWindow::showEvent(e);
}void MainWindow::closeEvent(QCloseEvent *e)
{if (!askSave()){e->ignore();return ;}settings.setValue("mainwindow/geometry", this->saveGeometry());settings.setValue("mainwindow/state", this->saveState());QMainWindow::closeEvent(e);
}void MainWindow::on_plainTextEdit_textChanged()
{if (fileName.isEmpty())fileName = u8"无标题";updateWindowTitle();bool empty = ui->plainTextEdit->toPlainText().isEmpty();ui->actionFind_F->setEnabled(!empty);ui->actionReplace_R->setEnabled(!empty);ui->actionFind_Next_N->setEnabled(!empty && findDialog && findDialog->isVisible());ui->actionFind_Prev_V->setEnabled(!empty && findDialog && findDialog->isVisible());
}void MainWindow::on_plainTextEdit_cursorPositionChanged()
{QTextCursor tc = ui->plainTextEdit->textCursor();QTextLayout* ly = tc.block().layout();int posInBlock = tc.position() - tc.block().position(); // 当前光标在block内的相对位置int line = ly->lineForTextPosition(posInBlock).lineNumber() + tc.block().firstLineNumber();int col = tc.columnNumber(); // 第几列// int row = tc.blockNumber(); // 第几段,无法识别WordWrap的第几行posLabel->setText(u8"第 " + QString::number(line + 1) + u8" 行,第 " + QString::number(col + 1) + u8" 列");
}void MainWindow::on_plainTextEdit_undoAvailable(bool b)
{ui->actionUndo_U->setEnabled(b);
}void MainWindow::on_plainTextEdit_selectionChanged()
{bool selected = ui->plainTextEdit->textCursor().hasSelection();ui->actionSearch_By_Bing->setEnabled(selected);ui->actionCut_T->setEnabled(selected);ui->actionCopy_C->setEnabled(selected);ui->actionDelete_L->setEnabled(selected);ui->actionReselect_Chinese->setEnabled(selected);
}void MainWindow::on_actionNew_triggered()
{if (!askSave())return ;openFile("");
}void MainWindow::on_actionNew_Window_triggered()
{QProcess p(this);p.startDetached(QApplication::applicationFilePath(), {"-new"});
}void MainWindow::on_actionOpen_triggered()
{if (!askSave())return ;QString recentPath = settings.value("recent/filePath").toString();QString path = QFileDialog::getOpenFileName(this, u8"打开", recentPath, "*.txt");if (path.isEmpty())return ;openFile(path);
}bool MainWindow::on_actionSave_triggered()
{if (filePath.isEmpty()) // 没有路径,另存为{QString recentPath = settings.value("recent/filePath").toString();QString path = QFileDialog::getSaveFileName(this, u8"另存为", recentPath, "*.txt");if (path.isEmpty())return false;settings.setValue("recent/filePath", path);filePath = path;fileName = QFileInfo(path).baseName();}// 写出文件QFile file(filePath);if (!file.open(QIODevice::WriteOnly)){qWarning() << "打开文件失败";return false;}QTextStream ts(&file);ts.setCodec("GBK");savedContent = ui->plainTextEdit->toPlainText();ts << savedContent;file.close();qInfo() << "save:" << filePath << savedContent.length();updateWindowTitle();return true;
}bool MainWindow::on_actionSave_As_triggered()
{QString temp = filePath;filePath = "";if (!on_actionSave_triggered()) // 直接调用保存的filePath = temp;return true;
}void MainWindow::on_actionExit_triggered()
{if (!askSave())return ;this->close();
}void MainWindow::on_actionUndo_U_triggered()
{ui->plainTextEdit->undo();
}void MainWindow::on_actionCut_T_triggered()
{ui->plainTextEdit->cut();
}void MainWindow::on_actionCopy_C_triggered()
{ui->plainTextEdit->copy();
}void MainWindow::on_actionPaste_P_triggered()
{ui->plainTextEdit->paste();
}void MainWindow::on_actionDelete_L_triggered()
{QTextCursor tc = ui->plainTextEdit->textCursor();int pos = tc.position();if (pos >= ui->plainTextEdit->toPlainText().length())return ;tc.setPosition(pos + 1, QTextCursor::MoveMode::KeepAnchor);tc.removeSelectedText();
}void MainWindow::on_actionSearch_By_Bing_triggered()
{// !这里是转到UTF-8,保存到txt是保存为GBKQByteArray key = ui->plainTextEdit->textCursor().selectedText().toUtf8().toPercentEncoding();QDesktopServices::openUrl(QUrl("https://cn.bing.com/search?q=" + key + "&form=NPCTXT"));
}void MainWindow::on_actionSelect_All_A_triggered()
{ui->plainTextEdit->selectAll();
}void MainWindow::on_actionTime_Date_D_triggered()
{ui->plainTextEdit->insertPlainText(QDateTime::currentDateTime().toString("hh:mm yyyy/MM/dd"));
}void MainWindow::on_actionWord_Wrap_W_triggered()
{if (ui->plainTextEdit->wordWrapMode() == QTextOption::NoWrap){ui->plainTextEdit->setWordWrapMode(QTextOption::WordWrap);ui->actionWord_Wrap_W->setChecked(true);settings.setValue("wordWrap", true);}else{ui->plainTextEdit->setWordWrapMode(QTextOption::NoWrap);ui->actionWord_Wrap_W->setChecked(false);settings.setValue("wordWrap", false);}
}void MainWindow::on_actionFont_F_triggered()
{bool ok;QFont f = QFontDialog::getFont(&ok, ui->plainTextEdit->font(), this, u8"字体");if (!ok)return ;ui->plainTextEdit->setFont(f);settings.setValue("font", f.toString());
}void MainWindow::on_actionZoom_In_I_triggered()
{if (zoomSize >= 500)return ;ui->plainTextEdit->zoomIn(1);zoomSize += 10;zoomLabel->setText(QString::number(zoomSize) + "%");
}void MainWindow::on_actionZoom_Out_O_triggered()
{if (zoomSize <= 10)return ;ui->plainTextEdit->zoomOut(1);zoomSize -= 10;zoomLabel->setText(QString::number(zoomSize) + "%");
}void MainWindow::on_actionZoom_Default_triggered()
{QString fs;if (!(fs = settings.value("font").toString()).isEmpty()){QFont f;f.fromString(fs);ui->plainTextEdit->setFont(f);}else{ui->plainTextEdit->setFont(qApp->font());}zoomSize = 100;zoomLabel->setText(QString::number(zoomSize) + "%");
}void MainWindow::on_actionStatus_Bar_S_triggered()
{if (this->statusBar()->isHidden()){this->statusBar()->show();ui->actionStatus_Bar_S->setChecked(true);settings.setValue("statusBar", true);}else{this->statusBar()->hide();ui->actionStatus_Bar_S->setChecked(false);settings.setValue("statusBar", false);}
}void MainWindow::on_actionAbout_A_triggered()
{QMessageBox::about(this, u8"关于", u8"高仿 Windows 记事本的 Qt 实现方案");
}void MainWindow::on_actionFind_F_triggered()
{if (!findDialog){createFindDialog();}findDialog->openFind(false);
}void MainWindow::on_actionFind_Next_N_triggered()
{const QString& text = findDialog->getFindText();if (text.isEmpty())return ;QTextDocument::FindFlags flags;if (findDialog->isCaseSensitive())flags |= QTextDocument::FindCaseSensitively;bool rst = ui->plainTextEdit->find(text, flags);if (!rst && findDialog->isLoop()&& ui->plainTextEdit->toPlainText().contains(text)) // 没找到,尝试从头开始{qInfo() << "从开头查找";QTextCursor tc = ui->plainTextEdit->textCursor();tc.setPosition(0);ui->plainTextEdit->setTextCursor(tc);on_actionFind_Next_N_triggered();}
}void MainWindow::on_actionFind_Prev_V_triggered()
{const QString& text = findDialog->getFindText();if (text.isEmpty())return ;QTextDocument::FindFlags flags = QTextDocument::FindBackward;if (findDialog->isCaseSensitive())flags |= QTextDocument::FindCaseSensitively;bool rst = ui->plainTextEdit->find(text, flags);if (!rst && findDialog->isLoop()&& ui->plainTextEdit->toPlainText().contains(text)){qInfo() << "从末尾查找";QTextCursor tc = ui->plainTextEdit->textCursor();tc.setPosition(ui->plainTextEdit->toPlainText().length());ui->plainTextEdit->setTextCursor(tc);on_actionFind_Prev_V_triggered();}
}void MainWindow::on_actionReplace_R_triggered()
{if (!findDialog){createFindDialog();}findDialog->openFind(true);
}void MainWindow::on_actionGoto_G_triggered()
{// TODO:转到// 我的记事本这个选项一直是灰色的
}void MainWindow::on_actionHelp_triggered()
{QDesktopServices::openUrl(QUrl("https://github.com/iwxyi/Qt-notepad"));
}void MainWindow::on_actionFeedback_F_triggered()
{QDesktopServices::openUrl(QUrl("https://github.com/iwxyi/Qt-notepad/issues"));
}void MainWindow::on_plainTextEdit_customContextMenuRequested(const QPoint&)
{QMenu* menu = new QMenu();QMenu* insertUnicodeControlCharsMenu = new QMenu("插入 Unicode 控制字符(&I)", menu);QList<QPair<QString, QString>> unicodeControlChars{{"LRM", "&Left-to-right mark"},{"RLM", "&Right-to-left mark"},{"ZWJ", "Zero width joiner"},{"ZWNJ", "Zero width &non-joiner"},{"LRE", "Start of left-to-right &embedding"},{"RLE", "Start of right-to-left e&mbedding"},{"LRO", "Start of left-to-right &override"},{"RLO", "Start of right-to-left o&verride"},{"PDF", "&Pop directional formatting"},{"NADS", "N&ational digit shapes substitution"},{"NODS", "Nominal (European) &digit shapes"},{"ASS", "Activate &symmetric swapping"},{"ISS", "Inhibit s&ymmetric swapping"},{"AAFS", "Activate Arabic &form shaping"},{"IAFS", "Inhibit Arabic form s&haping"},{"RS", "Record Separator (&Block separator)"},{"US", "Unit Separator (&Segment separator)"}};for (auto p: unicodeControlChars){QAction* action = new QAction(p.first, insertUnicodeControlCharsMenu);action->setToolTip(p.second);// TODO: 把提示也显示出来connect(action, &QAction::triggered, ui->plainTextEdit, [=]{// TODO: 插入 Unicode 控制字符// ui->plainTextEdit->insertPlainText("\u202c");});insertUnicodeControlCharsMenu->addAction(action);}menu->addAction(ui->actionUndo_U);menu->addSeparator();menu->addAction(ui->actionCut_T);menu->addAction(ui->actionCopy_C);menu->addAction(ui->actionPaste_P);menu->addAction(ui->actionDelete_L);menu->addSeparator();menu->addAction(ui->actionSelect_All_A);menu->addSeparator();menu->addAction(ui->actionRead_Direction);menu->addAction(ui->actionShow_Unicode_Control_Chars);menu->addMenu(insertUnicodeControlCharsMenu);menu->addSeparator();menu->addAction(ui->actionRead_Mode);menu->addAction(ui->actionReselect_Chinese);menu->addSeparator();menu->addAction(ui->actionSearch_By_Bing);menu->exec(QCursor::pos());menu->deleteLater();
}void MainWindow::on_actionRead_Direction_triggered()
{auto direction = ui->actionRead_Direction->isChecked() ? Qt::RightToLeft : Qt::LeftToRight;ui->plainTextEdit->setLayoutDirection(direction);
}void MainWindow::on_actionRead_Mode_triggered()
{if (ui->plainTextEdit->isReadOnly()){ui->plainTextEdit->setReadOnly(false);ui->actionRead_Mode->setText(u8"关闭输入法(&L)");}else{ui->plainTextEdit->setReadOnly(true);ui->actionRead_Mode->setText(u8"打开输入法(&O)");}
}void MainWindow::on_actionShow_Unicode_Control_Chars_triggered()
{// TODO: 显示 Unicode 控制字符
}void MainWindow::on_actionReselect_Chinese_triggered()
{// TODO: 汉字重选
}void MainWindow::on_actionPrefrence_triggered()
{// TODO: 页面设置
}void MainWindow::on_actionPrint_triggered()
{// TODO: 打印
}
#include "finddialog.h"
#include "ui_finddialog.h"FindDialog::FindDialog(QSettings &settings, QWidget *parent) :QDialog(parent),ui(new Ui::FindDialog),settings(settings)
{ui->setupUi(this);//this->setWindowFlags(Qt::WindowContextHelpButtonHint);// 读取数据ui->findEdit->setText(settings.value("find/findText").toString());ui->replaceEdit->setText(settings.value("find/replaceText").toString());ui->caseSensitiveCheck->setChecked(settings.value("find/caseSensitive").toBool());ui->loopCheck->setChecked(settings.value("find/loop").toBool());if (!settings.value("find/down", true).toBool())ui->upRadio->setChecked(true);
}FindDialog::~FindDialog()
{delete ui;
}void FindDialog::openFind(bool replace)
{ui->label_3->setVisible(replace);ui->replaceEdit->setVisible(replace);ui->replaceButton->setVisible(replace);ui->replaceAllButton->setVisible(replace);ui->groupBox->setVisible(!replace);QDialog::show(); // open/exec会导致模态ui->findEdit->setFocus();ui->findEdit->selectAll();this->adjustSize();if (!replace)setWindowTitle(u8"查找");elsesetWindowTitle(u8"替换");
}const QString FindDialog::getFindText() const
{return ui->findEdit->text();
}const QString FindDialog::getReplaceText() const
{return ui->replaceEdit->text();
}bool FindDialog::isCaseSensitive() const
{return ui->caseSensitiveCheck->isChecked();
}bool FindDialog::isLoop() const
{return ui->loopCheck->isChecked();
}void FindDialog::on_findNextButton_clicked()
{if (ui->upRadio->isChecked())emit signalFindPrev();elseemit signalFindNext();settings.setValue("find/findText", ui->findEdit->text());
}void FindDialog::on_replaceButton_clicked()
{emit signalReplaceNext();settings.setValue("find/replaceText", ui->replaceEdit->text());
}void FindDialog::on_replaceAllButton_clicked()
{emit signalReplaceAll();settings.setValue("find/replaceText", ui->replaceEdit->text());
}void FindDialog::on_cancelButton_clicked()
{this->close();
}void FindDialog::on_caseSensitiveCheck_clicked()
{settings.setValue("find/caseSensitive", ui->caseSensitiveCheck->isChecked());
}void FindDialog::on_loopCheck_clicked()
{settings.setValue("find/loop", ui->loopCheck->isChecked());
}void FindDialog::on_upRadio_clicked()
{settings.setValue("find/down", false);
}void FindDialog::on_downRadio_clicked()
{settings.setValue("find/down", true);
}void FindDialog::showEvent(QShowEvent *event)
{emit signalShow();adjustSize();QWidget::showEvent(event);
}void FindDialog::hideEvent(QHideEvent *event)
{emit signalHide();QWidget::hideEvent(event);
}void FindDialog::on_findEdit_returnPressed()
{on_findNextButton_clicked();
}void FindDialog::on_replaceEdit_returnPressed()
{on_replaceButton_clicked();
}

三、下载连接

https://download.csdn.net/download/u013083044/89660580

这篇关于QT-window记事本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098629

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

js window.addEventListener 是什么?

window.addEventListener 是 JavaScript 中的一个方法,用于向指定对象(在这个情况下是 window 对象,代表浏览器窗口)添加事件监听器,以便在该对象上发生特定事件时执行相应的函数(称为事件处理函数或事件监听器)。 这个方法接受三个参数: 事件类型(type):一个字符串,表示要监听的事件类型。例如,"click" 表示鼠标点击事件,"load" 表示页面加

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init