Qt写一个文档复制粘贴助手app
环境如下
创建工程
打开Qt Creater 7.0.0(community)
下载安装环境的自行百度吧
我们点击文件-> New Project ->然后再下图中选择Qt widgets Application
按照如下选好之后,选择choose
在如下界面中,名字是你的工程名,路径是工程所在路径,会在工程所在路径下面创建一个文件夹
选择build System ,我这里无脑选择Qmake
一切都无脑下一步,不细说了这里直接贴图
加了一个中文的translation 不确定是干嘛的
选择kit ,我的版本可能新一点
Summary
创建之后的文件夹路径如下,我这是开了两个工程,但是文件夹都是创建的基本工程,没有自行新加文件夹或者文件
app界面编辑
双击打开ui文件,看到前端界面
前端界面如下
添加一个按键(pushButton)和一个文本框(textBrowser)
添加方法为拖拽
这个时候点击运行 下面的绿色运行可以看见有界面弹出了,通过点击debug窗口修改构建配置
运行之后界面如下:
处理程序添加
回到刚才的编辑界面,编辑mainwindow.cpp
全部程序如下,下面分小节单独解释一下
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QClipboard>
std::string formatString(std::string str) {
std::string newStr = str;
int r = newStr.find('\r');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find('\r');
}
}
r = newStr.find(' ');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find(' ');
}
}
r = newStr.find('\n');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find('\n');
}
}
return newStr;
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Init();
}
MainWindow::~MainWindow()
{
delete ui;
}
//void MainWindow::onButton
void MainWindow::Init(){
connect(ui->onButton,SIGNAL(clicked(bool)),this,SLOT(doProcessClickNum(bool)));
}
void MainWindow::doProcessClickNum(bool){
// ui->textBrowser->setPlainText("s b");
QClipboard *clipboard = QApplication::clipboard();
QString text;
text = QString::fromStdString(formatString(clipboard->text().toStdString()));
clipboard->setText(text);
ui->textBrowser->setPlainText(text);
}
mainwidow.h 的文件在修改后如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void doProcessClickNum(bool);
private:
// QPushButton *onButton;
Ui::MainWindow *ui;
void Init();
};
#endif // MAINWINDOW_H
字符串删减
formatString函数将输入中的换行和空格删除
(本功能用于处理caj阅读器中复制出来的文档全都有奇奇怪怪的东西)
具体实现如果看不懂可以去查c++字符串
std::string formatString(std::string str) {
std::string newStr = str;
int r = newStr.find('\r');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find('\r');
}
}
r = newStr.find(' ');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find(' ');
}
}
r = newStr.find('\n');
while (r != std::string::npos)
{
if (r != std::string::npos)
{
newStr.replace(r, 1, "");
r = newStr.find('\n');
}
}
return newStr;
}
将按键,触发事件和函数绑定
具体的原理不清楚,但是在Init函数中加了这个connect函数,把ui的button 和SIGNAL,触发程序都指定之后,就会在按键按下之后触发doProcessClickNum(bool)函数
void MainWindow::Init(){
connect(ui->onButton,SIGNAL(clicked(bool)),this,SLOT(doProcessClickNum(bool)));
}
按键函数
具体功能是,从剪贴板获取文字,将剪贴板中的文字中的空格,换行删除,并传递给剪贴板,以及把结果输出给textBrowser显示
void MainWindow::doProcessClickNum(bool){
QClipboard *clipboard = QApplication::clipboard();
QString text;
text = QString::fromStdString(formatString(clipboard->text().toStdString()));
clipboard->setText(text);
ui->textBrowser->setPlainText(text);
}
程序单独运行
就算生成的是release ,.exe文件运行可能也会报错各种dll找不到,自己复制粘贴还会报错入口找不到
这里就要用到windeployqt
这里贴一下别人的介绍:
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行。
因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe。
生成exe文件并拷贝
好了,知道它是干嘛的了,我们把从工程中用Release 编译输出的.exe文件复制出来,我的路径是这样的 各位自行参考
D:\project\Qtproj\build-txt_assist-Desktop_Qt_6_2_4_MinGW_64_bit-Release\release\txt_assist.exe
把txt_assist.exe 复制到另一个文件夹下,可以给他单独创建一个文件夹,比如text,我的路径如下
D:\project\Qtproj\test
打开Qt命令行
我的命令行如下
打开MinGW这个命令行,因为我编译时用的是大概率是上面这个
执行下面这条语句。exe文件路径用你自己的路径
然后就会发现这个路径下面多了一堆东西
这个时候直接双击这个txt_assist.exe,就可以直接运行了
另外如果直接用cmd执行windeployqt txt_assist.exe这句话会报错:
Warning: Unable to read c:\qt\qt_1489878162099\_b_env\Library\mkspecs\qconfig.pri:
可能是它默认路径下的windeployqt和我的不是一个版本
如果有需要的可以从这里下载,不过我也不知道换台电脑能不能用
链接:https://pan.baidu.com/s/1LFFUlweWEUcNYHrizHItVQ?pwd=xvt0
提取码:xvt0