- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 PyQt5 将一个 Qlabel 拖放到另一个 Qlabel 上:
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QHBoxLayout, QVBoxLayout, QGridLayout,QFrame, QComboBox, QLabel, QLineEdit
from PyQt5.QtGui import QIcon, QFont, QPixmap, QImage
import sys
class my_label(QLabel):
def __init__(self,title,parent):
super().__init__(title,parent)
self.setAcceptDrops(True)
def dragEnterEvent(self,event):
if event.mimeData().hasFormat("text/plain"):
event.accept()
else:
event.ignore()
def dropEvent(self,event):
self.setText(event.mimeData().text())
class application(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label = my_label("drop there",self)
label.resize(100,100)
label.move(190,65)
label_to_drag = QLabel("drag this",self)
#label_to_drag.setDragEnabled(True) #doesn't work with QLabel
self.show()
def closeEvent(self,event):
message = QMessageBox.question(self,"Message","Quit ?",QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
if message == QMessageBox.Yes:
event.accept()
else:
event.ignore()
app = QApplication(sys.argv)
fenetre = application()
sys.exit(app.exec_())
我想通过调用 setDragEnabled(True)
方法(就像我为 QLineEdit 所做的那样)使我的第一个标签“可拖动”,并将其放在第二个标签上以更改其文本。从另一个应用程序删除文本工作正常,但我找不到如何将 QLabel 拖到我自己的应用程序中......我错过了什么 ?
编辑:修改代码以尝试拖放图像:
class DraggableLabel(QLabel):
def __init__(self,parent,image):
super(QLabel,self).__init__(parent)
self.setPixmap(QPixmap(image))
self.show()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText(self.text())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class my_label(QLabel):
def __init__(self,title,parent):
super().__init__(title,parent)
self.setAcceptDrops(True)
def dragEnterEvent(self,event):
if event.mimeData().hasFormat("text/plain"):
print("event accepted")
event.accept()
else:
print("event rejected")
event.ignore()
def dropEvent(self,event):
if event.mimeData().hasImage():
self.setPixmap(QPixmap.fromImage(QImage(event.mimeData().imageData())))
class application(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label_to_drag = DraggableLabel(self,"index.jpg")
label = my_label("drop there",self)
label.resize(100,100)
label.move(190,65)
self.show()
当我将 DraggableLabel
(显示图像)放在 my_label
上时,事件被接受,但 hasImage()
总是返回 false。 ..我设置图像的方式有误吗?
最佳答案
在 QLabel
的情况下,您必须从头开始创建所有内容,为此您可以按照 docs 的示例进行操作.
在下面的示例中,我放置了一个示例,其中一个类只接受拖放,另一个类接受拖动,以便您可以看到每个部分并更好地理解。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QDrag, QPixmap, QPainter, QCursor
from PyQt5.QtCore import QMimeData, Qt
class DraggableLabel(QLabel):
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText(self.text())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class DropLabel(QLabel):
def __init__(self, *args, **kwargs):
QLabel.__init__(self, *args, **kwargs)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.acceptProposedAction()
def dropEvent(self, event):
pos = event.pos()
text = event.mimeData().text()
self.setText(text)
event.acceptProposedAction()
class Widget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label = DropLabel("drop there",self)
label.setGeometry(190, 65, 100,100)
label_to_drag = DraggableLabel("drag this",self)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
更新:
不要混淆 QDrag
和 QMimeData
,如果你想使用 imageData()
你必须用 setImageData 设置它()
如 docs 所示:
class DraggableLabel(QLabel):
def __init__(self,parent,image):
super(QLabel,self).__init__(parent)
self.setPixmap(QPixmap(image))
self.show()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText(self.text())
mimedata.setImageData(self.pixmap().toImage())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class my_label(QLabel):
def __init__(self,title,parent):
super().__init__(title,parent)
self.setAcceptDrops(True)
def dragEnterEvent(self,event):
if event.mimeData().hasImage():
print("event accepted")
event.accept()
else:
print("event rejected")
event.ignore()
def dropEvent(self,event):
if event.mimeData().hasImage():
self.setPixmap(QPixmap.fromImage(QImage(event.mimeData().imageData())))
关于python - 使用 PyQt5 拖放 QLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50232639/
#include #include int main(int argc, char** argv) { QApplication app(argc, argv); QLabel l
我有一个 QLabel,我想根据它包含的文本(加上侧面的一些边距)调整它的大小。,我已经尝试过: self.WarnLab = QtGui.QLabel(self.HeaderRight) font
我试图从一个函数返回一个 QLabel,但我一直收到错误: /media/root/5431214957EBF5D7/projects/c/qt/tools/plugandpaint/plugins/
我看过很多关于如何使用 paintevent 的示例,但我就是无法让它工作。 我的 .ui 文件中有一个名为“图像”的标签,我正试图在其中绘画。我失败得很惨。在我见过的大多数示例中,他们都使用了 QL
我试图让 QLabel 显示图像和一些与该图像垂直居中的文本。我不知道该怎么做。我在互联网上找到的大多数资源都建议使用以下代码: ui->label->setText(" Hello"); 但是我得到
我正在尝试使用 PyQt 为一段 python 代码制作一个 GUI。但是,由于我不知道的原因,GUI 似乎切断了两个 Qlabel 的末端。我已经针对类似问题浏览了 Stack Overflow 上
我正在尝试在 QLabel 中显示一些 html 代码。虽然 QLabel 正确呈现 html,但超链接实际上不起作用,图像链接只是生成丢失的图标图片而不是显示图像本身。 我猜这是 QLabel 的一
我有一个用样式表填充红色的 QLabel,但 QLabel 是矩形的,我想要一个圆形。我尝试添加边框半径,但它不起作用,可能是因为我将 QLabel 放在了 formLayout 中。 有没有一种简单
我正在实例化一个可编辑的 QLabel,如下所示: QLabel foo("some text"); foo.setTextInteractionFlags(Qt::TextEditorInterac
我想在 QT/PySide2 应用程序中显示圆形图像。 下面是我试过的代码。 self.statusWidget = QLabel() img = QImage(":/image.jpg").scal
如何设置QLabel的文本颜色和背景? 最佳答案 最好和推荐的方法是使用 Qt 样式表。文件:Qt 5 Style Sheet , Qt 6 Style Sheet . 要更改 QLabel 的文本颜
我正在尝试创建带有文本轮廓的标签。我只想要一个带有黑色轮廓的简单白色文本。我首先尝试在 css 中这样做 label.setStyleSheet("color:white; outline:2px b
我正在尝试创建带有文本轮廓的标签。我只想要一个带有黑色轮廓的简单白色文本。我首先尝试在 css 中这样做 label.setStyleSheet("color:white; outline:2px b
我读过这个How to distinguish between mouseReleaseEvent and mousedoubleClickEvent on QGrapnhicsScene还有这个Di
我正在尝试制作一个转盘播放器,当按住鼠标左键并向左或向右拖动时,它可以翻转图像序列。它几乎可以工作并且正在打印出正确的图像名称。但图像本身不会更新/重新绘制。 如果我从 eventFilter 方法的
我有一个这样的段落列表: list1 = [ "something", "more", ... "{ //image// }" "something" ... "{ //i
我自己设置 PyQt 时遇到问题。我的想法是创建一个带有歌曲标题和专辑封面的音乐播放器。我已经成功创建了自己的窗口并添加了专辑封面。但我无法将标签添加到正确的位置。我希望歌曲标题位于窗口的顶部中心,如
当我运行以下代码时,label 小部件 (?) 会显示,即使它尚未添加到任何布局中。我正在遵循的教科书还暗示我不应该看到它(直到我将其添加到布局中),但它无论如何都会出现。我期待看到一个空 windo
我试图在不使用 setScaledContents(True) 的情况下获得完全适合我的标签的图像,因为我希望 ImageGrab 具有与 QLabel 空间完全相同的尺寸。 我使用带有 bbox 的
我有几个 QLabel 实例,我希望这些实例没有边框或背景颜色。我尝试了以下方法: plbl = new QLabel(); plbl->setGeometry(210, 0, 26, 16); pl
我是一名优秀的程序员,十分优秀!