【发布时间】:2014-01-13 04:43:18
【问题描述】:
我正在使用 PyQt4 创建一个表单,该表单使用 Qlabel 在单独的窗口中显示基于 Web 的图像。应该是单击表单上的按钮通过从表单上的表格单元格中读取新图像 url 来使用新图像更新 Qlabel。
我认为我遇到的问题是不了解如何将 Qlabel 创建为类对象,然后我可以通过设置其 setPixmap() 属性对其进行更新。以下是我目前所写的:
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest
CAT_PICS = ["http://static.tumblr.com/ce35b04e242c6b8073f3ff7801147e9f/sz5wgey/obSmpcvso/tumblr_static_o-cats-kill-billions-facebook.jpg",
"http://jasonlefkowitz.net/wp-content/uploads/2013/07/cats-16140154-1920-1080.jpg",
"http://4.bp.blogspot.com/-MzZCzWI_6Xc/UIUQp1qPfzI/AAAAAAAAHpA/OTwHCJSWFAY/s1600/cats_animals_kittens_cat_kitten_cute_desktop_1680x1050_hd-wallpaper-753974.jpeg"]
class ImageLabel(QLabel):
def __init__(self, parent=None):
QLabel.__init__(self, parent)
url = self.text()
nam = QNetworkAccessManager()
def finishRequest(reply):
img = QImage()
img.loadFromData(reply.readAll())
myImage = QPixmap(img)
self.setFixedSize(myImage.size())
self.setPixmap(QPixmap(myImage))
nam.finished.connect(finishRequest)
nam.get(QNetworkRequest(QUrl(url)))
class MainForm(QDialog):
index = 0
def __init__(self):
super(MainForm, self).__init__()
changePhotoButton = QPushButton("Next Photo")
layout = QHBoxLayout()
layout.addWidget(changePhotoButton)
self.setLayout(layout)
self.connect(changePhotoButton, SIGNAL("clicked()"),
self.updatePhoto)
def updatePhoto(self):
url = CAT_PICS[self.index]
imageLabel = ImageLabel(url)
imageLabel.show()
self.index += 1
def main():
app = QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()
main()
代码会运行,但是当调用 ImageLabel 类时,QLabel 会使用 url 中的初始文本创建,但永远不会获取图像,并且会立即从视图中删除 Qlabel。
我将不胜感激有关如何使其正常工作的任何提示。
【问题讨论】:
-
你为什么要为这个操作创建一个 QLabel 子类?
-
嗨,我想让初始表单可以通过单击按钮来更新 Qlabel。到目前为止,我可以通过将代码放在 main() 中的 ImageLabel 类中创建带有图像的 Qlabel,但我无法通过将其放在其他任何地方来使其工作。我不知道如何处理
nam.finished.connect(finishRequest)和def finishRequest(reply):部分。 -
你真的不需要一个子类。您可以将按钮单击连接到设置相应像素图的插槽...此外,您使用
imageLabel = ImageLabel(url)而 ImageLabel 类没有这样的“init”方法参数...OT: “main()”作为一行在 python 中看起来很奇怪。 -
"我不知道如何处理 nam.finished.connect(finishRequest) 和 def finishRequest(reply): 部分。" -> 你到底关心什么?
-
由于我不熟悉插槽,您能写一些示例代码吗?我对
nam.finished.connect(finishRequest)或def finishRequest(reply)的语法不是很熟悉,目前还看不到清晰的解释。
标签: qt pyqt qtgui qtnetwork qt-signals