小编ekh*_*oro的帖子

如何从左上角开始向网格布局添加小部件

我在 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)

如何解决这个问题?

python layout pyqt

5
推荐指数
1
解决办法
4062
查看次数

C++ Qt QShortcut with numpad key

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一起使用?

c++ qt keyboard-shortcuts

5
推荐指数
1
解决办法
4454
查看次数

使用 QTreeView 行中的文本对齐方式错误

我有一个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文档以寻找可能的修复方法,但找不到任何明显的内容。

python pyqt text-alignment pyqt4 qtreeview

5
推荐指数
1
解决办法
1990
查看次数

如何在QGraphicsScene上绘图而不缩放画笔宽度?

我正在尝试绘制 QGraphicScene 数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是装饰性的,因此我希望视图与数据的大小无关。但我得到的是这样的:

带噪声的正弦波乘以 50000:

规模50000

带噪声的正弦波乘以 50:

规模 50

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

缩放比例50000 在此输入图像描述

这里发生了什么?为什么数据值变大了,笔的宽度就变了?为什么放大后缩放比例消失了?

重现此内容的代码如下。左键单击图可放大,右键单击可缩小。

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)

qt qt4 pyqt pyqt4

5
推荐指数
1
解决办法
1685
查看次数

pyqt动态生成QMenu动作并连接

还在学习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 signals-slots pyqt4 qmenu

5
推荐指数
1
解决办法
7734
查看次数

PyQt:从 QDesigner 包装对话框和连接按钮

我开始学习 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)

python pyqt signals-slots qpushbutton pyuic

5
推荐指数
1
解决办法
1082
查看次数

PySide QThread.terminate() 导致致命的 python 错误

我使用的是 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 qt multithreading pyside qthread

5
推荐指数
1
解决办法
4912
查看次数

PyQt/PySide 事件循环在哪里运行?

如果我打开一个 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_()

python events pyqt event-handling pyside

5
推荐指数
1
解决办法
6723
查看次数

PySide Qt tr() 不翻译,translate() 翻译 - 上下文错误?

我想使用 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)

python translation qt4 pyside

5
推荐指数
2
解决办法
7395
查看次数

PyQt5:QWebEngineView中的mouseClick和源代码

我有一个使用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版本失败了:

  • 对于Button1:根本没有鼠标点击反应.
  • 对于Button2:,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_STR

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 = …
Run Code Online (Sandbox Code Playgroud)

python qtwebkit qtestlib pyqt5 qtwebengine

5
推荐指数
1
解决办法
2361
查看次数