2015-03-30 7 views
7

In meinem Programm können meine Benutzer eine Textfolge von überall kopieren und in mein Programm einfügen. Ich benutze die einfache QApplication::clipboard()->text(); Funktion und alles funktioniert wie erwartet. Aber einige meiner Benutzer haben Probleme, wenn unter Windows 8.1QClipboard kann keine Daten aus der Zwischenablage erhalten, wenn sie aus dem Editor kopiert wurden

hier kopieren und versuchen, ist, wie ich den Text in der Zwischenablage von meiner Paste-Funktion zugreifen:

QString clipboard = QApplication::clipboard()->text(); 

//check if the clipboard is empty 
if(QApplication::clipboard()->text().isEmpty()) 
    return; 

//do something with clipboard 

Aber wenn der Text aus dem Editor kopiert wurde oder Chrome, der Text ist IMMER leer. Windows 7 Benutzer hatten keine Probleme. Nicht alle Windows 8 Benutzer haben dieses Problem, es ist nur eine Handvoll, aber das Problem ist konsistent. Wenn Sie von anderen zufälligen Orten oder innerhalb meines Programms selbst kopieren, funktioniert die Zwischenablage gut.

Ich habe versucht mit mimeData. Wenn Sie die Funktion formats() verwenden, ist nur einfacher Text ein verfügbares Format, aber der Text ist immer leer.

Der Text, der von Notepad/Chrome kopiert wird, wird in Zwischenablage-Viewern und anderem gut angezeigt und kann woanders in anderen Programmen eingefügt werden.

Kopieren und Einfügen ist eine sehr wichtige Funktion in meinem Programm und es ist frustrierend, dass meine Benutzer nicht von Notepad oder Chrome kopieren und einfügen können.

Irgendwelche Ideen? Vielen Dank für Ihre Zeit. :)

EDIT: Ich versuchte mit der "Windows" -Stil-Technik. Es gab keine Veränderung. Hier ist meine aktuelle, noch unworking Code:

QString clipboard = QApplication::clipboard()->text(); 

//check if the clipboard is empty 
if(clipboard.isEmpty()) 
{ 
    //might not actually be empty. Check using the other technique 
    if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL)) 
     { 
      HGLOBAL hGlobal = GetClipboardData(CF_TEXT) ;//hGlobal is NULL 
      if (hGlobal != NULL)//This never gets called because it is NULL 
      { 
       LPTSTR lpszData = (LPTSTR) GlobalLock(hGlobal) ; 
       if (lpszData != NULL) 
       { 
        clipboard.fromLocal8Bit((const char *)lpszData); 
        GlobalUnlock(hGlobal) ; 
       } 
      } 
      CloseClipboard() ; 
     } 

    if(clipboard.isEmpty()) 
     return; 
} 

Der kopierte Text zeigt sich fein in eine Zwischenablage-Viewer, aber mein Programm kann nicht egal um es zu bekommen, was: enter image description here

Wie kommt GetClipboardData () hebt nichts auf? Auch hier kann der kopierte Text in irgendein anderes Programm eingefügt werden, das ich ausprobiert habe ... einfach nicht von mir. Aber wenn es von woanders kopiert wird, ist das kein Problem.

+0

zuerst beseitigen die Möglichkeit, dass Windows 8.1 den Zugriff auf die Zwischenablage beschränkt.Kopieren Sie von der problematischen Quelle in ein anderes Programm. – UmNyobe

+0

Sicher. Ich wollte nur hinzufügen, dass die einzigen Benutzer, die dieses Problem hatten, Windows 8.1 und ich habe noch nie gehört, dass es auf einem anderen Betriebssystem passiert. Ich bin mir seiner Bedeutung nicht sicher, aber ich dachte, ich würde es trotzdem hinzufügen. – mrg95

+0

"Der Text, der von Notepad/Chrome kopiert wird, wird in Zwischenablage-Viewern und anderen Objekten angezeigt und kann an anderer Stelle in andere Programme eingefügt werden." – mrg95

Antwort

1

EDIT: Mit dieser Version, wenn der Benutzer kopiert Text und Text in die Zwischenablage, kopiert eine Funktion den Text dieses Mal in eine interne Textdatei nicht direkt in Ihr Programm, mit QFile. Eine andere Funktion kopiert den Text aus der internen Textdatei in Ihr Programm. Auf diese Weise, ich glaube, Ihr Programm nicht direkt mit dem Text in der Zwischenablage

clipboard.h

#ifndef CLIPBOARD_H 
#define CLIPBOARD_H 

#include <QDialog> 
#include <QClipboard> 
#include <QLabel> 
#include <QHBoxLayout> 
#include <QTextEdit> 
#include <QPushButton> 
#include <QFile> 
#include <QTextStream> 

class ClipBoard : public QDialog { 
    Q_OBJECT 

public: 
    explicit ClipBoard(QWidget *parent = 0); 
    ~ClipBoard(); 

private slots: 
    //the functions that will copy and paste text from the text file 
    void copyToTextFile(); 
    void paste(); 

private: 

    QPushButton *button; 
    QTextEdit *edit; 
    QString textFromClipBoard; 
    QClipboard *clipBoardText; 

    QString clipboard; 

}; 

#endif // CLIPBOARD_H 

clipboard.cpp

#include "clipboard.h" 
#include "ui_clipboard.h" 

ClipBoard::ClipBoard(QWidget *parent) : QDialog(parent) { 

    button = new QPushButton("&Paste Copied Text"); 

    edit = new QTextEdit; 

    /*when user copies text and text gets to clipboard, the text is copied 
     from clipboard to a text file then copied from the text file to the 
     program*/ 
    connect(button, SIGNAL(clicked()), this, SLOT(copyToNotepad())); 
    connect(button, SIGNAL(clicked()), this, SLOT(paste())); 


    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(button); 
    layout->addWidget(edit); 


    setLayout(layout); 

} 

/*This function copies text from the clipboard to an internal text file 
    created by the program*/ 
void ClipBoard::copyToTextFile() { 
    clipboard = QApplication::clipboard()->text(); 

    QFile output("out.txt"); 
    if (output.open(QIODevice::ReadWrite | QFile::Truncate | 
    QIODevice::Text)) { 
     QTextStream out(&output); 
     out << clipboard; 
    } 
} 

/*This function then copies the text from the internal text file and pastes 
    it to the text edit. So the program doesn't have to deal directly with the 
    clipboard*/ 
void ClipBoard::paste() { 

    QFile input("out.txt"); 
    if (input.exists()) { 
     if (input.open(QIODevice::ReadOnly | QIODevice::Text)) { 
      QTextStream in(&input); 
      clipboard = in.readAll(); 
     } 
    } 

    edit->setText(clipboard); 
} 

ClipBoard::~ClipBoard() { 

} 

main.cpp

würde zu tun hat
#include "clipboard.h" 
#include <QApplication> 

int main(int argc, char *argv[]) { 
    QApplication a(argc, argv); 

    ClipBoard w; 
    w.show(); 

    return a.exec(); 
} 

Schauen Sie durch und vergleichen Sie mit Ihrem Teil des Codes, um zu sehen, ob Sie etwas falsch gemacht haben. Aber wie Sie behaupten, dass es auf einigen Windows 8.1 Systemen funktioniert und nicht auf anderen verblüfft mich.

+0

Danke. Ja, ich benutze das gleiche System, und ich habe es oft variiert. Dies funktioniert auf den meisten Computern, aber einige meiner Benutzer (die für mein Programm bezahlt haben) können nicht aus bestimmten Programmen oder Quellen kopieren und einfügen. Gibt es eine Möglichkeit, dies ohne die Bibliotheksfunktionen von qt zu tun? Wie ein Standard Windows Weg oder etwas? vielleicht würde das funktionieren – mrg95

+0

Include Header in Ihrem Code und verwenden Sie die WinAPI-Methode zum Abrufen von Daten in der Zwischenablage. Check dies http://www.codeexperts.com/showthread.php?594-How-to-get-text-data-from-clipboard-using-WIN32 –

+0

Ich habe gerade versucht, was Sie vorgeschlagen. Keine Änderung. Noch können Dinge aus dem Editor nicht eingefügt werden, aber aus anderen Programmen. Schau dir meinen Schnitt an, um zu sehen, was ich getan habe. – mrg95

0

Ich hatte ähnliches Problem, die Lösung für mich ist Schlaf.

void MainWindow::on_clipboard_change(){ 

    QThread::msleep(1); //without this line I get allways empty clipboard 

    QString text = QGuiApplication::clipboard()->text(); 

    qDebug() << "clipboard change event triggered (" << text << ")"; 

} 
Verwandte Themen