9778


Qt Creator3.3.1でアプリ開発の勉強中です。

Googleで調べたのですが、見つからないのでヘルプがほしいと思い質問します。

Text EditにDrag & Dropでテキストファイルを表示したいと考えております。  
dragEnterEvent、dropEventを使えばできるっぽいというところまでは調べました。

プロジェクト作成時に作られるQMainWindowから派生したクラスはこの２つのメソッド  
がでてくるのですが、*.uiに配置したText Editに対してdragEnterEvent、dropEventを  
つなげればよいかがわからずに苦戦しております。

どうしたら*.uiに配置したText Editに対してDrag & Dropでテキストファイルを表示  
させることができるかを教えてください。


CC BY-SA 3.0
2015-05-02T12:20:56.533
9773
2015-06-01T15:29:47.923
2015-05-02T14:51:25.767
3639
5818
question
qt5 qt qt-creator
Text EditにDrag & Dropでテキストファイルを表示したい。(Qt Creatorにて）


まず、`QTextEdit`のサブクラスを作成します。

**mytextedit.h**

[code]

    #ifndef MYTEXTEDIT_H
    #define MYTEXTEDIT_H
    
    #include <QTextEdit>
    
    class MyTextEdit : public QTextEdit
    {
        Q_OBJECT
    public:
        MyTextEdit(QWidget *parent = 0);
        void dragEnterEvent(QDragEnterEvent *event);
        void dropEvent(QDropEvent *event);
    };
    
    #endif // MYTEXTEDIT_H
    
[/code]

**mytextedit.cpp**

[code]

    #include "mytextedit.h"
    #include <QDragEnterEvent>
    #include <QMimeData>
    #include <QUrl>
    #include <QFile>
    
    MyTextEdit::MyTextEdit(QWidget *parent) :
       QTextEdit(parent)
    {
        setAcceptDrops(true);
    }
    
    void MyTextEdit::dragEnterEvent(QDragEnterEvent *event)
    {
        if (!event->mimeData()->urls().empty())
            event->acceptProposedAction();
    }
    
    void MyTextEdit::dropEvent(QDropEvent *event)
    {
        QFile file(event->mimeData()->urls().first().toLocalFile());
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;
    
        setPlainText(file.readAll());
        event->acceptProposedAction();
    }
    
[/code]

次に、フォームエディタで`*.ui`上に配置された`QTextEdit`をこのサブクラスに **格上げ** します。  
フォームエディタ上で配置した`QTextEdit`を右クリックすると「格上げ先を選択...」という項目が表示されるはずです。

![ScreenShot](https://i.stack.imgur.com/fMIfi.png)

このダイアログで`MyTextEdit`を「追加」し、「格上げ」を行うとDrag & Dropに対応したTextEditを使うことができます。


CC BY-SA 3.0
2015-05-02T14:43:11.360
9778
2015-05-02T14:43:11.360
3639
9773
answer