我正在尝试将 PySide 应用程序版本 #1 移植到 PySide2,并努力寻找移植以下代码片段的解决方案:
class AppManager(QtCore.QObject):
'''
methods of AppObject will be available from javascript
'''
def __init__(self, webview):
QtCore.QObject.__init__(self)
class WebView(QWebEngineView):
def __init__(self, parent=None):
QWebEngineView.__init__(self, parent)
self.setPage(WebEnginePage(self))
def contextMenuEvent(self, event):
pass
class AppWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.view = WebView(self)
self.page = self.view.page()
self.app_manager = AppManager(self.view)
self.page.mainFrame().addToJavaScriptWindowObject('app_manager', self.app_manager)
# ERROR in above line !!!
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到必须找到可能的修复方法
我尝试制作一个简单的示例来帮助理解 QSignalMapping 的概念如何在 PySide 中工作。我想通过循环迭代来动态创建一系列按钮,当用户按下其中一个按钮时,我可以激活一个方法,为按下的按钮返回适当的标签。
from PySide2 import QtWidgets,QtCore,QtGui
fruit_list = ["apples","oranges","pears"]
def fruit_button_event():
print "this is the pressed button's label"
def main():
for fruit in fruit_list:
fruit_button = QtWidgets.QPushButton(fruit)
fruit_button.clicked.connect(lambda:fruit_button_event())
main()
Run Code Online (Sandbox Code Playgroud) 我的 PySide 项目中有许多旋转框,我想更改行为,因此用户需要单击字段来更改值,然后按 Enter 键。我想禁用旋转框的滚轮行为。我尝试过设置焦点策略,但没有生效。
def light_label_event(self,text,checked):
print("this is the pressed button's label", text)
def populate_lights(self):
for light in self.lights:
light_label = QtWidgets.QSpinBox()
light_label.setFocusPolicy(QtCore.Qt.StrongFocus)
Run Code Online (Sandbox Code Playgroud) 我刚刚开始为即将到来的项目使用 PySide2 和 QML,我立即偶然发现了一个问题:如何将 python 类(继承自 QObject)发出的信号连接到 .qml 文件中的插槽?例如:我有一个 QThread(python 类),每 50 毫秒生成几个 xy 坐标。我想将生成的对添加到 QML 文件中定义的 LineSeries,以生成类似示波器的绘图。
这个问题可能真的很基本而且很愚蠢,但我真的需要一些帮助。
此致
兰多
编辑4:
我找到了解决方案,但我不太喜欢它。你能建议我(如果存在的话)一种更优雅的方法吗?
Python 代码:
class Manager(QObject):
dataReady = Signal(float,float)
def __init__(self):
QObject.__init__(self)
self._currX = 0
self._currY = 0
self._delay = 0.5
self._multiplier = 1.0
self._power = 1.0
self._xIncrement = 1.0
self._starter = False
self._threader = None
@Property(bool)
def starter(self):
return self._starter
@starter.setter
def setStarter(self, val):
print("New val: {0}, oldVal: {1}".format(val,self._starter))
if self._starter == val:
return
self._starter = val
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习 matplotlib 并尝试测试以下代码。
import matplotlib
from matplotlib.figure import Figure
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import sys
from PySide2 import QtGui
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
wid = QtGui.QWidget()
wid.resize(250, 150)
grid = QtGui.QGridLayout()
wid.setLayout(grid)
fig = Figure(figsize=(7,5), dpi=65, facecolor=(1,1,1), edgecolor=(0,0,0))
canvas = FigureCanvas(fig)
grid.addWidget(canvas)
wid.show()
Run Code Online (Sandbox Code Playgroud)
然而它似乎无法识别图的签名。
TypeError:使用错误的参数类型调用“PySide2.QtGui.QGridLayout.addWidget”:
PySide2.QtGui.QGridLayout.addWidget(FigureCanvasQTAgg) 支持的签名:
PySide2.QtGui.QGridLayout.addWidget(PySide2.QtGui.QWidget, int, int, PySide2. QtCore.Qt.Alignment = 0)
PySide2.QtGui.QGridLayout.addWidget(PySide2.QtGui.QWidget, int, int, int, int, PySide2.QtCore.Qt.Alignment = 0)
我正在尝试制作一个使用 QML QCharts 来可视化数据的应用程序。该程序在启动时甚至在窗口出现之前就崩溃了。我在 macOS 和 Windows 10 上都进行了尝试,结果相同。我在下面提供了一个最低限度的工作示例。
main.py:
import sys
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtCore import QUrl
import qml_rc
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(QUrl("qrc:/main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
main.qml:
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtCharts 2.13
ApplicationWindow {
visible: true
// Example taken from: https://doc.qt.io/qt-5/qtcharts-qmlchart-example.html
ChartView {
id: chart
title: "Top-5 car brand shares in Finland"
anchors.fill: parent
legend.alignment: Qt.AlignBottom
antialiasing: true …Run Code Online (Sandbox Code Playgroud) 我正在 Maya 2018 中开发一个自定义 ui,它使用 PyQt5(通过 PySide2 - 有一些微小的差异,但它本质上是 PyQt5)。
我有一个QHBoxLayout里面有两个小部件,它们的大小策略都设置为“扩展”。我将其中一个的最小宽度设置为另一个的两倍左右。
每当我扩展窗口时,较小的小部件都会扩展,直到它的大小与较大的小部件相同(这根本不会改变大小)......然后它们都继续以相同的速率扩展 - 都占据了一半的大小窗户。
我希望它们在整个扩展过程中保持相对大小。
有没有一种方法可以做到这一点,我完全忽略了?
这是我为重现该问题而编写的一些简化代码:
import PySide2.QtWidgets as QtWidgets
class TestDialog(QtWidgets.QDialog):
def __init__(self, *args, **kwargs):
QtWidgets.QDialog.__init__(self, *args, **kwargs)
main_layout = QtWidgets.QHBoxLayout()
self.setLayout(main_layout)
main_layout.setContentsMargins(5, 5, 5, 5)
main_layout.setSpacing(5)
w1 = QtWidgets.QPushButton('small')
w2 = QtWidgets.QPushButton('large')
w1.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
w2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
w2.setMinimumWidth(250)
main_layout.addWidget(w1)
main_layout.addWidget(w2)
self.setMinimumWidth(450)
self.setMinimumHeight(100)
self.resize(450, 100)
test = TestDialog()
test.show()
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 PySide 截取屏幕截图(并返回 QPixmap)。这是一个更大脚本的一部分。不幸的是,我现在碰壁了。
这是我试图开始工作的简化片段:
from PySide2 import QtGui, QtWidgets
screen = QtWidgets.QApplication.primaryScreen()
winid = QtWidgets.QApplication.desktop().winId()
pixmap = screen.grabWindow(winid)
label = QtWidgets.QLabel("test")
label.setPixmap(pixmap)
label.show()
Run Code Online (Sandbox Code Playgroud)
执行此操作时,会抛出以下错误:
TypeError: 'PySide2.QtGui.QScreen.grabWindow' called with wrong argument types:
PySide2.QtGui.QScreen.grabWindow(int)
Supported signatures:
PySide2.QtGui.QScreen.grabWindow(quintptr, int = 0, int = 0, int = -1, int = -1)
Run Code Online (Sandbox Code Playgroud)
我正在使用 PySide 版本 2.0.0~alpha0 (这是我正在使用的主机应用程序附带的版本)。我已经在使用 PySide2 版本 5.12.2 的新版本主机应用程序中测试了相同的代码,它按预期执行,没有任何错误...但是,我仅限于使用旧版本的主机应用程序。
有谁知道解决方法?
首先想到的是使用 PyQt5 生成 QPixmap,并让 PySide 从那里获取它,但在测试时发现 PyQt QPixmap 与 PySide 不兼容。将整个脚本移植到 PyQt 也不是一个选择。
我正在寻找一种简单的方法来为我的 PySide2 应用程序中的标题标签制作更大的文本大小。这是一个学习项目。我更喜欢使用样式表来更改标签字体。我也不希望使用硬编码点大小,因为这可能无法在不同的显示尺寸上正常工作。
这另一个问题看起来很有趣,但目前对我来说太复杂了。有没有一种简单的方法可以制作更大的字体,例如font-size: 200%?我确实尝试过,但到目前为止它还不起作用。
当我使用%时,字体大小根本没有改变。当我设置特定的大小时,font-size: 20px它会产生预期的结果。
我没有发现 Qt 文档有多大帮助(可能是因为我还不知道如何解决它们。)这是我的代码:
from PySide2 import QtWidgets
from PySide2.QtCore import Qt
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
mainLayout = QtWidgets.QVBoxLayout(self)
self.label = QtWidgets.QLabel("My Title")
self.label.setAlignment(Qt.AlignCenter | Qt.AlignHCenter)
self.label.setStyleSheet("font-weight: bold; font-size: 200%")
mainLayout.addWidget(self.label)
Run Code Online (Sandbox Code Playgroud) 我偶然发现了这一点(显然,这是一个更大的应用程序的摘录):
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
d = {}
widget = QWidget()
d[widget] = 'hashable'
item = QListWidgetItem('abc')
d[item] = 'unhashable'
Run Code Online (Sandbox Code Playgroud)
如果你运行这个,在最后一行你会得到:
TypeError: unhashable type: 'PySide2.QtWidgets.QListWidgetItem'
Run Code Online (Sandbox Code Playgroud)
据我所知,任何 Qt 对象都可以用作字典键,就像任何用户定义的类实例一样。
我在 Windows 7 上运行 PySide2 5.13.0、Python 3.6.4。我在 Ubuntu 18.04、Python 3.6.9、PySide 5.9.0a1 上遇到相同的错误。
感谢您的任何提示。
pyside2 ×10
python ×10
pyqt5 ×2
python-3.x ×2
qml ×2
css ×1
matplotlib ×1
maya ×1
qt-signals ×1
qtcharts ×1
qtwebchannel ×1