做一個記錄剪切板的工具

說在前邊

有時候寫論文,需要大量的【複製】【粘貼】操作,複製完新的卻發現之前複製的還要用到,但是已經被新複製的替換掉了,還得去重新複製麼?只能這樣子。基於此,自己動手寫了一個輔助剪切板的工具,很簡單不需要太多知識,代碼更簡單。

選擇文件,按Ctrl+V ,路徑就被複制到剪切板;剪切版存在圖片時,也臨時做了備份保存到本地,並不斷進行替換。

界面:

做一個記錄剪切板的工具

界面二:

顯示詳細:

做一個記錄剪切板的工具

文件備份:

做一個記錄剪切板的工具

代碼實現

新建工程,調整界面這些就不多說了。

頭文件:

做一個記錄剪切板的工具

class ClipBord : public QMainWindow
{
 Q_OBJECT
public:
 explicit ClipBord(QWidget *parent = 0);
 ~ClipBord();
protected slots:
 void addData();
 void contextMenuEvent(QContextMenuEvent *event);
 void keyPressEvent(QKeyEvent *event);
 void copy();
private slots:
 void on_checkBox_clicked(bool checked);
 void on_listWidget_currentTextChanged(const QString &currentText);
private:
 Ui::ClipBord *ui;
 QClipboard *b;
 Text *t;
 void saveData(QString data);
 bool isSave;
 QMenu *menu;
 QAction *a;
 int count;
};

獲取剪切板

b=QApplication::clipboard();

判斷複製到新文本就添加到列表。

做一個記錄剪切板的工具

為了程序的簡單,只針對文本,與圖片進行了保存。

void ClipBord::addData(){
 if(b->mimeData()->hasText()&&isSave){
 ui->listWidget->addItem(b->mimeData()->text());
 saveData(b->mimeData()->text());
 }
 if(b->mimeData()->hasImage()&&isSave){
 QImage img(b->image());
 img.save("img.png");
 }
}

寫到文件

具體什麼格式完全看自己,想怎麼設置怎麼設置。

void ClipBord::saveData(QString data){
 if(isSave){
 count++;
 t->appendLine(QString("\n\n").arg(count)+data+QString("\n").arg(count));
 }
}

添加右鍵複製操作

做一個記錄剪切板的工具

void ClipBord::keyPressEvent(QKeyEvent *event){
 if(event->modifiers()==Qt::ControlModifier&&event->key()==Qt::Key_V){
 isSave=true;
 }
}

鼠標右鍵複製時,禁止添加到列表

void ClipBord::copy(){
 isSave=false;
 int c=ui->listWidget->currentRow();
 if(c>-1&&clistWidget->count()){
 b->setText(ui->listWidget->item(c)->text());
 }else{
 b->setText("");
 }

按下Ctrl+V 開始記錄

void ClipBord::keyPressEvent(QKeyEvent *event){
 if(event->modifiers()==Qt::ControlModifier&&event->key()==Qt::Key_V){
 isSave=true;
 }
}

關聯剪切板與添加數據槽函數

connect(b,SIGNAL(changed(QClipboard::Mode)),this,SLOT(addData()));

所有代碼:

ClipBord::ClipBord(QWidget *parent) :
 QMainWindow(parent),
 ui(new Ui::ClipBord)
{
 ui->setupUi(this);
 menu=new QMenu();
 a=menu->addAction("Copy");
 t=new Text("clipbord_data.txt",MODE::Read);
 b=QApplication::clipboard();
 on_checkBox_clicked(false);
 connect(b,SIGNAL(changed(QClipboard::Mode)),this,SLOT(addData()));
 isSave=true;
 count=0;
 t->appendLine("\n"+QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
 connect(a,SIGNAL(triggered(bool)),this,SLOT(copy()));
}
ClipBord::~ClipBord()
{
 delete ui;
}
 
void ClipBord::addData(){
 if(b->mimeData()->hasText()&&isSave){
 ui->listWidget->addItem(b->mimeData()->text());
 saveData(b->mimeData()->text());
 }
 if(b->mimeData()->hasImage()&&isSave){
 QImage img(b->image());
 img.save("img.png");
 }
}
void ClipBord::saveData(QString data){
 if(isSave){
 count++;
 t->appendLine(QString("\n\n").arg(count)+data+QString("\n").arg(count));
 }
}
void ClipBord::on_checkBox_clicked(bool checked)
{
 ui->textEdit->setVisible(checked);
 if(checked){
 setFixedWidth(480);
 }else{
 setFixedWidth(160); 
 }
}
void ClipBord::contextMenuEvent(QContextMenuEvent *event){
 int c=ui->listWidget->currentRow();
 if(c>-1&&clistWidget->count()){
 menu->exec(event->globalPos());
 }
}
void ClipBord::keyPressEvent(QKeyEvent *event){
 if(event->modifiers()==Qt::ControlModifier&&event->key()==Qt::Key_V){
 isSave=true;
 }
}
void ClipBord::copy(){
 isSave=false;
 int c=ui->listWidget->currentRow();
 if(c>-1&&clistWidget->count()){
 b->setText(ui->listWidget->item(c)->text());
 }else{
 b->setText("");
 }
} 
void ClipBord::on_listWidget_currentTextChanged(const QString &currentText)
{
 ui->textEdit->setText(currentText);
}

到此已經結束。

說明:文章中的Text 是我自己封裝的讀寫操作,這個很容易實現就不多做說明。


分享到:


相關文章: