创建 Qt 应用程序
在本章中,我们将构建一个名为“multiclip”的应用程序,它允许您存储和检索剪贴板中的多个文本剪贴。最终如下:
先创建一个新项目;
在“界面文件”拖入需要的控件,调整好布局;
通过信号与槽编辑器对几个按钮进行信号与槽的连接;
完整代码:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QListWidget>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void dataChanged();
void clippingChanged(const QString &clipping);
void addClipping();
void copyPrevious();
void deleteClipping();
private:
Ui::Widget *ui;
QClipboard *clipboard;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_multiclip.h"
#include <QClipboard>
#include <QListWidget>
/*第一行作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,
*把我们在Qt设计器里面定义的信号和槽建立起来。
*接着给LCD设置背景颜色;并使窗体以LineEdit中的焦点开始。
*获取一个指向Qt全局剪贴板的指针
*将剪贴板的datachchanged()信号连接到自己创建的一个名为datachchanged()的槽;
*/
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lengthLCDNumber->setStyleSheet("background-color: rgb(204,232,255);");
ui->currentLineEdit->setFocus();
clipboard = QApplication::clipboard();
connect(clipboard, SIGNAL(dataChanged()), SLOT(dataChanged()));
dataChanged();
}
Widget::~Widget()
{
delete ui;
}
/*这个槽函数获取剪切板内容并更新lineEdit和ldc的显示
*判断如果autoCheckBox勾选,就把剪切板内容添加到clipListWidget中
*/
void Widget::dataChanged()
{
QString text = clipboard->text();
clippingChanged(text);
if (ui->autoCheckBox->isChecked())
addClipping();
}
/*设置lineEdit和lcd的显示内容*/
void Widget::clippingChanged(const QString &clipping)
{
ui->currentLineEdit->setText(clipping);
ui->lengthLCDNumber->display((int)clipping.length());
}
/*addbutton槽函数;
*如果有文本,lcd显示文本长度;
*遍历ListWidget中的所有项目,以查看是否已经有相同的文本;
*如果文本尚未在列表框中,我们将插入它。
*/
void Widget::addClipping()
{
QString text = ui->currentLineEdit->text();
if (!text.isEmpty())
{
ui->lengthLCDNumber->display((int)text.length());
int i = 0;
for ( ; i < (int)ui->clipListWidget->count(); i++)
{
QListWidgetItem* item = ui->clipListWidget->item(i);
if (!item || item->text() == text)
{
i = -1;
break;
}
}
if (i != -1)
{
ui->clipListWidget->insertItem(0, text);
}
}
}
/*将选定的内容从ListWidget复制到lineEdit中,也将放在剪贴板上;
*检查ListWidget中是否有选定项,如果是,则将该项复制到行编辑中。
*/
void Widget::copyPrevious()
{
if (ui->clipListWidget->selectedItems().count() > 0)
{
clipboard->setText(ui->clipListWidget->currentItem()->text());
}
}
/*删除按钮将删除ListWidget中的当前项并清除lineEdit*/
void Widget::deleteClipping()
{
QListWidgetItem* currentItem = ui->clipListWidget->currentItem();
if (currentItem)
{
delete currentItem; // 删除当前选中的项
clippingChanged(""); // 用空字符填充lineEdit
}
}
main.cpp:
#include <QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}