在推薦uclip之後,我發現它不適用於複製。 我開始調試這一點,從QT3先轉換爲QT4,看看是否能幫助 ,但它並沒有任何區別,最後我發現它 是know bug但標記爲「不會解決」:獲取QClipboard :: setText()在X11下工作所需的最小調整量是多少?
這是創建 QApplication後立即設置剪貼板的一個副作用。 X11剪貼板是事件驅動的,因此依賴於來自X服務器的當前時間戳 。這些時間戳自動由QApplication處理 。但是,在這個簡單的示例中,事件循環 未運行,因此我們沒有從X服務器獲取更新時間戳, 這又導致QClipboard :: ownsClipboard()返回false。設置 剪貼板響應例如鍵盤或鼠標事件使此 按預期工作。
理想最少的代碼使用QClipboard ::的setText()應該是 像下面
#include <qapplication.h>
#include <qclipboard.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QClipboard *cb = QApplication::clipboard();
QString input = "Hello clipboard";
cb->setText(input);
return 0;
//return app.exec(); makes no difference from return 0
}
但是正如我所說,這是不行的。經過反覆試驗,我有 拿出,將工作
#include <qapplication.h>
#include <qclipboard.h>
#include <QTimer>
#include <QtGui>
#include <iostream>
class MyApplication : public QApplication {
Q_OBJECT
public:
MyApplication(int & argc, char ** argv) : QApplication(argc, argv)
{
}
public slots:
void setClipboard()
{
QClipboard *cb = QApplication::clipboard();
QString input = "THIS WORKS";
std::cout << "setText line " << __LINE__+1 << "\n";
cb->setText(input);
}
};
class MainWidget:public QMainWindow {
public:
MainWidget() {
QClipboard *clipboard = QApplication::clipboard();
std::cout << "setText line " << __LINE__+1 << "\n";
clipboard->setText("This will not be copied to the clipboard, apparently also too early");
}
};
int main(int argc, char *argv[])
{
MyApplication app(argc, argv);
QClipboard *cb = QApplication::clipboard();
QString input = "This will not be copied to the clipboard, too early";
std::cout << "setText line " << __LINE__+1 << "\n";
cb->setText(input);
//QTimer::singleShot(3, &app, SLOT(setClipboard())); // 3 ok, 2 not ok
MainWidget mainWid;
//mainWid.show();
QTimer::singleShot(2, &app, SLOT(setClipboard())); // 2 ok, 1 not ok
return app.exec();
}
#include "main.moc"
不過,我相信這既不是最低,也沒有做到這一點的最好辦法如下。 因此,我問,需要什麼來以最小的努力和影響生成這樣一個所需的時間戳更新?
不幸的是,這並沒有幫助,因爲app.processEvents()只會觸發QT的事件處理,它依賴於某些未觸發的X11活動。在最簡單的例子中,我最初使用「return app.exec()」而不是「return 0」。 – hlovdal 2009-04-12 17:02:29
因此,爲了使剪貼板工作,必須觸發X11的任何事件循環?在Qt方面想不出任何東西。 – 2009-04-13 18:57:41
是的,這可能是比QT更多的X11問題。 MainWidget的實例顯然已經足夠了,但是我想避免創建一個比需要更重的虛擬對象,最好還是儘可能避免創建虛擬對象。 – hlovdal 2009-04-15 10:38:54