系統剪貼板是跨進程數據交換的共享池。Qt 通過 QClipboard 封裝平台差異,支持文本、圖片、像素圖及自定義 MIME 數據。
ClipboardDemo::ClipboardDemo(QWidget *parent)
: QWidget(parent) {
QVBoxLayout *main = new QVBoxLayout(this);
QHBoxLayout *north = new QHBoxLayout;
QHBoxLayout *south = new QHBoxLayout;
QTextEdit *editor = new QTextEdit;
QLabel *label = new QLabel("Text Input:");
label->setBuddy(editor);
QPushButton *copyBtn = new QPushButton("Set Clipboard");
QPushButton *pasteBtn = new QPushButton("Get Clipboard");
north->addWidget(label);
north->addWidget(editor);
south->addWidget(copyBtn);
south->addWidget(pasteBtn);
main->addLayout(north);
main->addLayout(south);
connect(copyBtn, &QPushButton::clicked, this, &ClipboardDemo::setClipboard);
connect(pasteBtn, &QPushButton::clicked, this, &ClipboardDemo::getClipboard);
}
void ClipboardDemo::setClipboard() {
QClipboard *board = QApplication::clipboard();
board->setText("Text from Qt Application");
}
void ClipboardDemo::getClipboard() {
QClipboard *board = QApplication::clipboard();
QString str = board->text();
QMessageBox::information(this, "From clipboard", str);
}
| 操作 | 方法 | 說明 |
|---|---|---|
| 寫文本 | setText(QString) | 存儲 plain/text |
| 讀文本 | text() → QString | 獲取 plain/text |
| 寫圖片 | setImage(QImage) | 存儲 image/* 格式 |
| 讀圖片 | image() → QImage | |
| 寫像素圖 | setPixmap(QPixmap) | 針對屏幕顯示優化 |
| 讀像素圖 | pixmap() → QPixmap | |
| 通用寫入 | setMimeData(QMimeData*) | 支持自定義類型 |
| 通用讀取 | mimeData() → QMimeData* | 需自行解析 |
QTextEdit、QLineEdit 等已內置 Ctrl+C/V/X 處理,無需額外代碼。開發前請查閱文檔,避免重複造輪子。
繼承 QMimeData,重寫 formats()、retrieveData(),配合 setMimeData() 實現任意類型跨進程傳遞(參考前文「自定義拖放數據對象」)。
Linux/X11 下鼠標中鍵(滾輪)點擊可粘貼「主選區」內容:
void MyEditor::mouseReleaseEvent(QMouseEvent *event) {
QClipboard *cb = QApplication::clipboard();
if (event->button() == Qt::MidButton && cb->supportsSelection()) {
QString text = cb->text(QClipboard::Selection);
pasteText(text);
}
}
supportsSelection() 僅在 X11 返回 true。
connect(QApplication::clipboard(), &QClipboard::dataChanged,
this, &MyClass::onClipboardChanged);
Qt 剪貼板操作極簡:QApplication::clipboard() 獲取單例 → setXxx()/xxx() 讀寫。善用 QMimeData 擴展類型,利用 dataChanged 實時響應。
本文出自 “豆子空間” 博客,原文地址:https://devbean.blog.51cto.com/448512/292229