我正在使用 PyQt 和 PyQtGraph 来构建一个相对简单的绘图 UI。作为其中的一部分,我有一个图形视图(pyqtgraph 的 graphicslayoutwidget),其中包含由用户动态添加的 PlotItem。
我想要实现的是允许用户通过双击它来选择一个 PlotItem。
如果用户在小部件窗口中的某处双击,这很简单,但我似乎无法弄清楚如何返回点击的内容。
我的大多数搜索结果都试图为某些按钮重新实现 mousePressEvent。我已经阅读了一些关于事件过滤器的内容,但我不确定这是否是必要的解决方案。
我不确定还有哪些其他信息可能有助于回答这个问题,所以如果不清楚我要问什么,请告诉我,以便我进行澄清。
编辑:
复制本:
我在 windows 7 64 位机器上使用这个 python 代码,它只是显示随机生成的黑白图像。如果我使图像大于 511x511 像素,我的 python 2.7 控制台就会崩溃。不过它在我的 Mac 上运行良好。有任何想法吗?
import sys
from PyQt4 import QtGui, QtCore
import numpy as np
class PixmapTest(QtGui.QWidget):
    def __init__(self):
        super(PixmapTest, self).__init__()
        imglayout = QtGui.QHBoxLayout(self)
        size = 512
        img_8bit = (256*np.random.random((size,size))).astype(np.uint8)     
        img = QtGui.QImage(img_8bit.repeat(4), size, size, QtGui.QImage.Format_RGB32)
        pixmap = QtGui.QPixmap(img)
        imglabel = QtGui.QLabel(self)
        imglabel.setPixmap(pixmap)
        imglayout.addWidget(imglabel)
        self.setLayout(imglayout)
        self.show()        
def main():
    app = QtGui.QApplication(sys.argv)
    form = PixmapTest()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()
有人知道如何在 PyQt 上实现循环进度条吗?
另外,我发现了一个现有的代码:http : //sourceforge.net/projects/qroundprogressbar/
但是,它在 C++ 中如何。如何将它用于 PyQt?
更新:使用下面的 QRoundProgressBar 实现,我创建了一个完整的演示应用程序,带有开始按钮来演示 QRoundProgressBar。将 QroundProgressBar 保存在 circleprogressbar.py 中,并在同一目录中为下面的代码创建一个新文件。希望它可以帮助其他人。
from circularprogressbar import QRoundProgressBar
import sys
from PyQt4.QtGui import *
from PyQt4 import QtCore, QtGui, Qt
from time import sleep
class TstWidget(QtGui.QWidget):
    def __init__(self):
        super(type(self), self).__init__()
        self.bar = QRoundProgressBar()
        self.bar.setFixedSize(300, 300)
        self.bar.setDataPenWidth(3)
        self.bar.setOutlinePenWidth(3)
        self.bar.setDecimals(1)
        self.bar.setFormat('%v | %p %')
        # self.bar.resetFormat()
        self.bar.setNullPosition(90)
        self.bar.setBarStyle(QRoundProgressBar.StyleDonut)
        self.bar.setDataColors([(0., QtGui.QColor.fromRgb(255,0,0)), (0.5, QtGui.QColor.fromRgb(255,255,0)), (1., QtGui.QColor.fromRgb(0,255,0))])
        self.bar.setMaximun(100)
        self.bar.setMinimun(0)
        self.bar.setRange(0, 100)
        self.bar.setValue(0)
        button = QtGui.QPushButton("Start", self)
        button.clicked.connect(self.on_start)
        lay = QtGui.QVBoxLayout() …目前我正在尝试将自定义 QWidget 类添加到 QVBoxLayout。我遇到的问题是小部件根本没有出现在布局中。我什至尝试设置 QWidget 的最小大小,因为我认为小部件没有显示,因为它的默认大小设置为零。
这是类的简化:
class myWidget(QWidget):
    def __init__(self):
        super().__init__()
        # Slider
        self.mySlider = QSlider(Qt.Horizontal)
        self.mySlider.setRange(-360, 360)
        # LCD Screen
        self.lcd = QLCDNumber()
        self.lcd.setMinimumHeight(45)
        self.lcd.setMaximumHeight(75)
        # set Size
        self.setMinimumSize(QSize(400,300))
我删除了滑块和 LCD 屏幕之间的信号和插槽,因为我在这里不担心功能。只有我在以下代码中的两个按钮之间直接获得了 QSize(400,300) 的灰色区域:
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        #Create Widgets to be Added to Central Widget
        self.w1 = QPushButton("First")
        self.w2 = myWidget()
        self.w3 = QPushButton("Third")
        #Set Central Widget and VBox
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)
        #Add widgets
        self.layout.addWidget(self.w1)
        self.layout.addWidget(self.w2)
        self.layout.addWidget(self.w3)
所以我所做的只是创建 3 个小部件,并将它们放入中央小部件内的 QVBoxLayout …
我正在尝试将一个简单的字符串附加到 and 对象中的列表中。但我猜 self 关键字会干扰 pyqt 窗口?
我该如何解决这个问题?
class Window(qt.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.CreateWidgets()       
        self.q = Qfetch.DataFetch()
    def CreateWidgets(self):
        toPortfolio = "str"
        self.q.Portfolio.append(toPortfolio) #<---- This cause the error
q班
class DataFetch():
    def __init__(self):
        self.Portfolio = []
我是 pyqt 的新手(Maya 中的 pyside),请对我好一点:)
所以关键是我想通过循环语句生成许多按钮,类似于下面的东西:
(窗口中的 5 个按钮 - 完整代码 - 玛雅)
import PySide.QtCore as qc
import PySide.QtGui as qg
class simpleUI(qg.QDialog):
    def __init__(self):
        qg.QDialog.__init__(self)
        self.setWindowTitle('Simple UI')
        self.btn=[]
        for x in range(5) :
           self.btn.append(x)
           self.btn[x]= qg.QPushButton(self)
           self.btn[x].setText('this is btn number{0}'.format(x))
           self.btn[x].setGeometry(qc.QRect(0,100+(x*20), 100,20))
           self.btn[x].clicked.connect(lambda : self.notifyMe(x))
    def notifyMe(self,index):
        print index
dialog = simpleUI()
dialog.show()
如您所见,我将按钮对象存储在数组中,但问题是当我想将 btn 信号与notifyMe 函数连接时,每个按钮总是给出 x 相同的值 (x=4),同时在button.setText x 成功给出唯一的增量值,我不明白为什么..
你能解释一下为什么退出按钮在这种情况下不能正常工作:
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication
class Example(QWidget):
    def __init__(self):
        super().__init__()       
        self.initUI()
    def initUI(self):               
        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.move(50, 50)       
        self.setGeometry(300, 300, 250, 150)   
        self.show()
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
但如果我在函数中包含最后三行,则有效:
def fun():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
fun()
我不明白机制:(
我正在使用使用 QT Designer 生成的 python 代码。我想通过 MainWindow 上的按钮打开一个新对话。当我使用以下代码时,对话窗口一创建就消失了。我认为这是因为 QDialog 对象在该方法命中 return 语句时被销毁。调用这种对话的正确方法是什么?
def OpenDialogue(self):
    DialogueWindow = QtGui.QDialog()
    my_dialogue = MyDialogue.Ui_Dialog()
    my_dialogue.setupUi(DialogueWindow)
    DialogueWindow.show()
    return
例如,我应该在定义 MainWindow 的同一位置实例化 DialogueWindow 并将其传递给此方法吗?
MainWindow 构造函数如下:
class Ui_MainWindow(QtGui.QMainWindow, object):
    def setupUi(self, MainWindow):
        [code]
它的实例化如下:
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = GUI.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
app.exec_()
我想用pyqt5创建一个浏览按钮,但我不明白
from PyQt5 import QtWidgets,QtCore, QtGui
import test3 
class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.ui = test3.Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton_2.clicked.connect(self.getfiles)
    def getfiles(self):
        fileName = QtGui.QFileDialog.getOpenFileName(self,'Single File','C:\'','*.xlsm')
        self.ui.lineEdit.setText(fileName)
if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
这是我通过复制各种教程和 SO 帖子创建的代码:
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import QObject, pyqtSignal, QThread
class Worker(QThread):
    def __init__(self):
        QThread.__init__(self)
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        worker = Worker()
        worker.start()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())
这很简单,但是当我运行它时,python 立即崩溃。我正在使用 Anaconda3,我非常确定 python 环境设置正确,但我可能是错的。我在 Windows 10、64 位、Anaconda3 和 Python 3.5(64 位)上。我使用 conda 安装了 qt4。
pyqt ×10
python ×10
pyqt5 ×2
python-2.7 ×2
qt ×2
anaconda ×1
maya ×1
pyqt4 ×1
pyqtgraph ×1
qlayout ×1
qmouseevent ×1
qt-designer ×1
qwidget ×1