我在 Qt Designer 中创建了一个 UI 并将其转换为 python:

在空白区域中,我添加了一个滚动区域和一个网格布局来对齐我的按钮。
每次按下“CreatePose”按钮时,我都需要从左上角开始向 gridlayout 添加一个带有图标的按钮。现在它将它添加到网格布局的中心。
self.ui.PoseBtn_GridLayout.setColumnMinimumWidth(4,4)
self.button = QtGui.QPushButton('')
self.button.setIcon(self._icon)
self.button.setIconSize(QtCore.QSize(128, 128))
self.button.setMinimumSize(QtCore.QSize(128, 128))
self.button.setMaximumSize(QtCore.QSize(128, 128))
self.ui.PoseBtn_GridLayout.addWidget(self.button)
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
QShortcut可以轻松地将QShortcutEvent(按键,组合或序列)连接到插槽方法,例如:
QShortcut *shortcut = new QShortcut( QKeySequence(Qt::Key_7), this, 0, 0, Qt::ApplicationShortcut);
Run Code Online (Sandbox Code Playgroud)
(提示:对于数字键,可以使用QSignalMapper将QShortcut的activated()信号映射到带int参数的Slot ).
但是,在此示例中,使用NumLock(启用了numpad),两个"7"键都将触发Shortcut的activated()信号.
有没有一种方法来检测比过滤或重新实现Widget的其他不同的键keyPressEvent和检查QKeyEvent ::修饰符()的Qt的:: KeypadModifier?
我发现,进一步挖掘
QTBUG-20191的Qt :: KeypadModifier不setShortcut工作链接到已在2012年九月被合并到4.8补丁,并且配备了一个测试用例使用
button2->setShortcut(Qt::Key_5 + Qt::KeypadModifier);
Run Code Online (Sandbox Code Playgroud)
这对Qt 4.8.1上的QShortcut不起作用,即使用(添加)修饰符标志都不能识别'7'键.
所以我想最快的方法是安装一个过滤器来检测修饰符,并让默认实现处理所有其他的keyEvent,以便与QShortcut一起使用?
我有一个QTreeView(带有PyQt4),使用下面的代码自定义和调整大小的图标,但“大小”列显示错误的对齐/位置,如下所示:

self.ui.treeView.setIconSize(QtCore.QSize(30,30))
fileSystemModel = QtGui.QFileSystemModel(self.ui.treeView)
custonIconProvider = CustomIconsProvider()
fileSystemModel.setIconProvider(custonIconProvider)
self.ui.treeView.setModel(fileSystemModel)
self.ui.treeView.setRootIndex(fileSystemModel.setRootPath(forlderPath))
self.ui.treeView.setColumnWidth(0, 250)
self.ui.treeView.setColumnWidth(1, 70)
self.ui.treeView.setColumnWidth(2, 70)
Run Code Online (Sandbox Code Playgroud)
我已经搜索了http://pyqt.sourceforge.net/Docs/PyQt4/qtreeview.html文档以寻找可能的修复方法,但找不到任何明显的内容。
我正在尝试绘制 QGraphicScene 数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是装饰性的,因此我希望视图与数据的大小无关。但我得到的是这样的:
带噪声的正弦波乘以 50000:

带噪声的正弦波乘以 50:

但是,如果我放大这些图中的任何一个(两个图的缩放量相同),我最终会达到两个图像看起来相同的水平:

这里发生了什么?为什么数据值变大了,笔的宽度就变了?为什么放大后缩放比例消失了?
重现此内容的代码如下。左键单击图可放大,右键单击可缩小。
import sys
from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC
import numpy as n
class ZoomView(QG.QGraphicsView):
"""Zoomable QGraphicsView"""
def mouseReleaseEvent(self,event):
if event.button() == QC.Qt.LeftButton:
self.scale(1.5,1)
elif event.button() == QC.Qt.RightButton:
self.scale(1/1.5,1)
class MainUI(QG.QDialog):
def __init__(self, parent=None):
super(MainUI, self).__init__(parent)
layout = QG.QVBoxLayout()
self.setLayout(layout)
button_layout = QG.QHBoxLayout()
pb3 = QG.QPushButton('add plot')
button_layout.addWidget(pb3)
layout.addLayout(button_layout)
pb3.clicked.connect(self.scene_maker_singleshot)
scene = QG.QGraphicsScene()
view = ZoomView(self)
view.setTransformationAnchor(QG.QGraphicsView.AnchorUnderMouse)
view.setRenderHint(QG.QPainter.Antialiasing)
layout.addWidget(view)
view.setScene(scene)
self.view = view
self.scene = …Run Code Online (Sandbox Code Playgroud) 还在学习pyqt如何工作.我想动态生成customContextMenu并与函数连接.到目前为止,我得到以下,但连接部分不工作?
import sys
from PyQt4 import QtGui, QtCore
class MainForm(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
# create button
self.button = QtGui.QPushButton("test button", self)
self.button.resize(100, 30)
# set button context menu policy
self.button.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.connect(self.button, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu)
self.popMenu = QtGui.QMenu(self)
def on_context_menu(self, point):
self.popMenu.clear()
#some test list for test
testItems = ['itemA', 'itemB', 'itemC']
for item in testItems:
action = self.btn_selectPyFilterPopMenu.addAction("Selected %s" % item)
self.connect(action,QtCore.SIGNAL("triggered()"),self,QtCore.SLOT("printItem('%s')" % item))
self.popMenu.exec_(self.button.mapToGlobal(point))
@pyqtSlot(str)
def printItem(self, item):
print item
def main():
app = QtGui.QApplication(sys.argv)
form = …Run Code Online (Sandbox Code Playgroud) 我开始学习 Python 和 PyQt。目前,我正在解决一个关于连接信号和插槽的非常基本的问题,使用从 QDesigner 生成的对话框表单。我想从 QDialog 连接一个按钮。该代码不会产生错误。正如预期的那样,对话框显示出来。但是点击按钮没有任何反应。
或者,我尝试将代码表单Ui_Dialog直接包含在我的目标类中Testdialog。然后连接正常工作。似乎我在从Ui_DialogtoTestdialog和/或我想要执行对话框的方式继承属性时犯了一个错误。
我的主程序如下所示:
from __future__ import unicode_literals
import sys
from PyQt4 import *
from PyQt4 import QtGui
from PyQt4.QtCore import SIGNAL, QObject
import UI_Test
class Testdialog(QtGui.QDialog, UI_Test.Ui_Dialog):
def __init__(self,parent=None):
super(Testdialog, self).__init__(parent)
self.setupUi(self)
print("Connect buttons") # gives the expected output
self.connect(self.pushButton_Ok, SIGNAL("clicked()"), self.clickedOk)
self.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
# Alternativly I have tríed the following without improvement:
# self.pushButton_Ok.clicked.connect(self.clickedOk)
# QObject.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
def clickedCancel(self):
print ("Cancel") # …Run Code Online (Sandbox Code Playgroud) 我使用的是 PySide 版本 1.2.2,它包装了 Qt v4.8 框架。QThread我面临的情况是,我必须在让我的应用程序等待我不再需要正常退出的情况(线程很可能会无限期地阻塞)和给无响应的线程一个宽限期(几秒钟)之间做出选择),然后调用QThread.terminate()它。尽管我希望可以,QThread但当底层线程仍在运行时,我不能让对象超出范围,因为这会抛出错误“QThread:线程仍在运行时被销毁”,并且几乎肯定会导致段错误。
请注意,我知道终止QThreads 是危险的并且强烈建议不要这样做。我只是想在这里探索我的选择。
然而,当我尝试终止线程时,我的应用程序崩溃并出现以下错误:
Python 致命错误:释放时该线程状态必须是当前状态
您可以通过复制/粘贴并运行以下代码自行尝试:
from PySide import QtCore, QtGui
class Looper(QtCore.QThread):
"""QThread that prints natural numbers, one by one to stdout."""
def __init__(self, *args, **kwargs):
super(Looper, self).__init__(*args, **kwargs)
self.setTerminationEnabled(True)
def run(self):
i = 0
while True:
self.msleep(100)
print(i)
i += 1
# Initialize and start a looper.
looper = Looper()
looper.start()
# Sleep main thread for 5 seconds.
QtCore.QThread.sleep(5)
# Terminate …Run Code Online (Sandbox Code Playgroud) 如果我打开一个 Python 解释器并输入以下几行:
from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
Run Code Online (Sandbox Code Playgroud)
然后出现一个文本输入小部件。当我与口译员互动时,我可以与它互动。如果我附加了任何事件处理程序,它们也会被调用。
如果我这样做import time; time.sleep(10),小部件将无响应 10 秒。
如果我运行app.exec_(),该调用会阻塞,直到我关闭应用程序。
我的问题是:app.exec_()如果小部件已经在响应事件,那么运行的意义何在?有什么不同吗?这是否只是一种防止应用程序关闭同时仍为 Qt 的事件循环提供服务的方法(while True: pass正如我们所理解的那样,会导致事件循环阻塞time.sleep(10))
我还想了解 Qt 在哪里与 CPython 挂钩,允许解释器和 GUI 处于活动状态。我知道 Python 2(可能还有 3?)有一个所谓的PyOS_InputHook机制,大约每秒调用 10 次。IPython 使用它来运行 GUI(需要付出很多努力以每秒 10 次以上的速度处理 GUI 事件)。当我实例化 a 时是否发生了同样的事情QApplication?如果是这样,再一次,打电话有什么意义app.exec_()
我想使用 QTranslator 以便能够使用英文文本标签,并且仍然让软件显示德文标签。
不幸的是,我的应用程序不会翻译,除非我指定了上下文。以下静态函数实例化 QApplication 并添加所需的转换器。
第一个打印将“Apple2”正确翻译为“Apfel2”。Qt Linguist 中的上下文也有上下文“app”。不过,第二个印刷品没有翻译。tr()类中的调用(在同一个 python 文件中定义)也不翻译。
def load_application():
app = QApplication()
qt_translator = QTranslator()
qt_translator.load('qt_' + QLocale.system().name(), QLibraryInfo.location(QLibraryInfo.TranslationsPath))
app.installTranslator(qt_translator)
app_translator = QTranslator()
r = app_translator.load('i18n/' + QLocale.system().name())
app.installTranslator(app_translator)
print(app.translate('app', 'Apple2'))
print(app.tr('Apple'))
return app
Run Code Online (Sandbox Code Playgroud)
编辑:
静态函数的部分是正确的。应用程序的上下文是 QApplication。但这对 QMainWindow 子类没有帮助。我相应地更新了代码。pyside-lupdate 为类生成的上下文是 MainWindow:
看法
class MainWindow(QMainWindow):
add_model_widget = None
def __init__(self):
QMainWindow.__init__(self)
# Create menu bar
menu_bar = QMenuBar(self)
m_file = QMenu(self.tr('File'), menu_bar)
a_add_model = QAction(QIcon('add.png'), self.tr('Add Jewel'), self)
m_file.addAction(a_add_model)
menu_bar.addMenu(m_file)
self.setMenuBar(menu_bar)
def load_application():
app = …Run Code Online (Sandbox Code Playgroud) 我有一个使用PyQt-5.5.1的工作脚本,我现在想要移植到一个新的PyQt版本(5.7).适应大多数事情很好,但我面临两个主要问题:(1)执行(模拟)鼠标点击,(2)访问(假设:打印)当前显示的网页的html源代码分别是QWebView或QWebEngineView.
例如,我可以使用PyQt-5.5.1中的QWebView执行以下操作:
QTest.mouseClick(self.wvTest, Qt.LeftButton, QPoint(x, y))
Run Code Online (Sandbox Code Playgroud)
和
frame = self.wvTest.page().mainFrame()
print(frame.toHtml().encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
我知道有关移植到QWebEngineView但无法将C++表示法转换为可用的Python代码的文档以及此页面.
如何在PyQt-5.7中将其改编为QWebEngineView?下面是PyQt-5.5.1的一个完整工作片段,它对于新的PyQt版本失败了:
AttributeError: 'QWebEnginePage' object has no attribute 'mainFrame'当我删除大型机()时:TypeError: toHtml(self, Callable[..., None]): not enough arguments.import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QRect, Qt, QUrl, QPoint, QEvent from PyQt5.QtTest import QTest from PyQt5.Qt import PYQT_VERSION_STRRun Code Online (Sandbox Code Playgroud)if PYQT_VERSION_STR=='5.5.1': from PyQt5 import QtWebKitWidgets else: from PyQt5 import QtWebEngineWidgets
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.button1 = …