2009-04-12 36 views
0

在推薦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" 

不過,我相信這既不是最低,也沒有做到這一點的最好辦法如下。 因此,我問,需要什麼來以最小的努力和影響生成這樣一個所需的時間戳更新?

回答

0

我會給一個嘗試是這樣的:

QApplication app(argc, argv); 
// Paste something to your clipboard 
app.processEvents(); 

這實際上使Qt應用程序處理的事件循環的所有等待事件的東西,如果你不叫app.exec不發生( )和第一個例子中一樣,並且與第二個例子非常類似,但實際上你需要使用計時器來完成相同的操作。我還沒有嘗試過,這也是文檔建議的方式(處理剪貼板作爲對用戶輸入事件的響應)。

+0

不幸的是,這並沒有幫助,因爲app.processEvents()只會觸發QT的事件處理,它依賴於某些未觸發的X11活動。在最簡單的例子中,我最初使用「return app.exec()」而不是「return 0」。 – hlovdal 2009-04-12 17:02:29

+0

因此,爲了使剪貼板工作,必須觸發X11的任何事件循環?在Qt方面想不出任何東西。 – 2009-04-13 18:57:41

+0

是的,這可能是比QT更多的X11問題。 MainWidget的實例顯然已經足夠了,但是我想避免創建一個比需要更重的虛擬對象,最好還是儘可能避免創建虛擬對象。 – hlovdal 2009-04-15 10:38:54

0

我相信你在X11上運氣不佳。管理X11剪貼板取決於應用程序本身。所以當你的應用程序關閉剪貼板上的數據時,數據就會丟失。

我認爲你最好的選擇是調用命令行xclip命令。將剪貼板上需要的文本輸入到它。我不確定這個命令通常有多可用。它一定是在做一些可以用較低級別的x代碼重新創建的東西?

相關問題