PyQt5のhasImageメソッドで画像が認識されません


ウインドウに画像をドラッグ＆ドロップして表示するだけのプログラムが作りたいのですが、下のコードで実行してローカルの画像を入れると、  
`True False False True False`  
と出力されます。つまり、画像が画像データとして認識されません。どの拡張子の画像でも認識されませんでした。ウェブからのドラッグでも認識されませんでした。おそらくPC側の問題ではないかと思うのですが、よくわかりません。  
同様の質問が見当たらなかったので、非常に初歩的な質問するまでもない問題だと思うのですが、自分にはどうしても原因がわかりません。原因がわかる方、よろしくお願いします。

[code]

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setAcceptDrops(True)
            self.vbl = QVBoxLayout()
            self.setLayout(self.vbl)
     
            self.setGeometry(300, 50, 400, 350)
            self.setWindowTitle('QCheckBox')
    
            self.show()
    
        def dragEnterEvent(self, e): 
                e.accept()
        
        def dropEvent(self,e):
            print(e.mimeData().hasText(),e.mimeData().hasHtml(),e.mimeData().hasImage(),e.mimeData().hasUrls(),e.mimeData().hasColor())
            label = QLabel()
            pix = QPixmap(e.mimeData().imageData())
            label.setPixmap(pix)
            self.vbl.addWidget(label)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        main_window = MainWindow()
        main_window.show()
        app.exec_()
    
[/code]




ドロップされたデータから画像のパス名を取り出して、イメージを作成する必要があるのだと思います。  
`dropEvent()`を次のように書き換えればうまくいくと思います。  
※確認したのはWindowsです。

[code]

        def dropEvent(self, e):
            import urllib.request
            print(e.mimeData().hasText(), e.mimeData().hasHtml(), e.mimeData().hasImage(), e.mimeData().hasUrls(),
                  e.mimeData().hasColor())
            label = QLabel()
            path = urllib.request.url2pathname(e.mimeData().urls()[0].path())
            image = QImage(path)
            pix = QPixmap.fromImage(image)
            label.setPixmap(pix)
            self.vbl.addWidget(label)
    
[/code]

Windowsのパス名はドライブ名の先頭に`/`が付加されてしまいます。  
`urllib.request.url2pathname`で削除しています。  
<https://stackoverflow.com/questions/43911052/urlparse-on-a-windows-file-
scheme-uri-leaves-extra-slash-at-start>

* * *

metropolisさんから次のコメントがありました。

> ウェブブラウザから画像をドラッグ・アンド・ドロップする場合、そのコードでは何も表示されないのでご注意を。

このような使い方をすることを全然考えていませんでした。調べてみたところ次の記事を見つけました。  
<https://qiita.com/y-chan/items/7d99a3dc3f1cc55dad6a>  
この記事を参考にしたコードを書いてみたところ、ネット上の画像が表示されました。

[code]

        def dropEvent(self, e):
            if e.mimeData().hasHtml():
                import requests
                import base64
                url = e.mimeData().urls()[0].toString()
                data = base64.b64encode(requests.get(url).content).decode()
                label = QLabel(f"<img src=\"data:image/png;base64,{data}\"/>")
                self.vbl.addWidget(label)
            else:
                import urllib.request
                label = QLabel()
                path = urllib.request.url2pathname(e.mimeData().urls()[0].path())
                image = QImage(path)
                pix = QPixmap.fromImage(image)
                label.setPixmap(pix)
            self.vbl.addWidget(label)
    
[/code]




ドロップされたデータから画像のパス名を取り出して、イメージを作成する必要があるのだと思います。  
`dropEvent()`を次のように書き換えればうまくいくと思います。  
※確認したのはWindowsです。

[code]

        def dropEvent(self, e):
            import urllib.request
            print(e.mimeData().hasText(), e.mimeData().hasHtml(), e.mimeData().hasImage(), e.mimeData().hasUrls(),
                  e.mimeData().hasColor())
            label = QLabel()
            path = urllib.request.url2pathname(e.mimeData().urls()[0].path())
            image = QImage(path)
            pix = QPixmap.fromImage(image)
            label.setPixmap(pix)
            self.vbl.addWidget(label)
    
[/code]

Windowsのパス名はドライブ名の先頭に`/`が付加されてしまいます。  
`urllib.request.url2pathname`で削除しています。  
<https://stackoverflow.com/questions/43911052/urlparse-on-a-windows-file-
scheme-uri-leaves-extra-slash-at-start>

* * *

metropolisさんから次のコメントがありました。

> ウェブブラウザから画像をドラッグ・アンド・ドロップする場合、そのコードでは何も表示されないのでご注意を。

このような使い方をすることを全然考えていませんでした。調べてみたところ次の記事を見つけました。  
<https://qiita.com/y-chan/items/7d99a3dc3f1cc55dad6a>  
この記事を参考にしたコードを書いてみたところ、ネット上の画像が表示されました。

[code]

        def dropEvent(self, e):
            if e.mimeData().hasHtml():
                import requests
                import base64
                url = e.mimeData().urls()[0].toString()
                data = base64.b64encode(requests.get(url).content).decode()
                label = QLabel(f"<img src=\"data:image/png;base64,{data}\"/>")
                self.vbl.addWidget(label)
            else:
                import urllib.request
                label = QLabel()
                path = urllib.request.url2pathname(e.mimeData().urls()[0].path())
                image = QImage(path)
                pix = QPixmap.fromImage(image)
                label.setPixmap(pix)
            self.vbl.addWidget(label)
    
[/code]

