有没有一种简单的方法可以在 Qt4 中拥有类似 iTunes 的界面(使用Miller Columns),还是我必须自己创建一个 MillerColumnWidget ?
我找不到将鼠标事件附加到场景的方法。如果没有 View,所有事件都会被捕获,但是当注释掉时,只有 mousePressEvent 起作用。请帮忙。
from PySide import QtGui, QtCore
class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.Scene()
        self.View()
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print "Pressed!!!"
    def mouseMoveEvent(self, event):
        print "moving....."
    def mouseReleaseEvent(self, event):
        print "-------released"
    def Scene(self):
        self.s = QtGui.QGraphicsScene(self)
    def View(self):
        self.v = QtGui.QGraphicsView(self.s)
        self.setCentralWidget(self.v)
if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())
我尝试使用信号从线程接收字符串到我的主 GUI。一切正常,直到我想在 QMessageBox 中使用该字符串。打印出来没有问题,但是启动 QMessageBox 给了我几个错误(有些是关于 QPixmap 的,我什至不在 GUI 中使用。
这是我的代码的一个简短的工作示例:
import sys
import urllib2
import time
from PyQt4 import QtCore, QtGui
class DownloadThread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)
    def run(self):
        time.sleep(3)
        self.emit(QtCore.SIGNAL("threadDone(QString)"), 'test')
class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.list_widget = QtGui.QListWidget()
        self.button = QtGui.QPushButton("Start")
        self.button.clicked.connect(self.start_download)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.button)
        layout.addWidget(self.list_widget)
        self.setLayout(layout)
        self.downloader = DownloadThread()
        self.connect(self.downloader, QtCore.SIGNAL("threadDone(QString)"), self.threadDone, QtCore.Qt.DirectConnection)
    def start_download(self):
        self.downloader.start()
    def threadDone(self, info_message):
        print info_message
        QtGui.QMessageBox.information(self,
                    u"Information",
                    info_message
                    )
        #self.show_info_message(info_message)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = …我想在QTreeView中显示“文件夹”和“文件” 。文件夹旨在能够包含文件,并且由于这种关系,我希望文件夹项目显示在树视图中的文件项目上方。视图应该是可排序的。如何确保在树视图中文件夹项目始终显示在文件项目之上?
以下代码提供了包含文件夹和文件项的树视图示例:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
def _create_item(text, is_folder):
    item = QStandardItem(text)
    item.setData(is_folder, Qt.UserRole)
    return item
def _folder_row(name, date):
    return [_create_item(text, True) for text in (name, date)]
def _file_row(name, date):
    return [_create_item(text, False) for text in (name, date)]
class _Window(QMainWindow):
    def __init__(self):
        super().__init__()
        widget = QWidget()
        self.__view = QTreeView()
        layout = QVBoxLayout(widget)
        layout.addWidget(self.__view)
        self.setCentralWidget(widget)
        model = QStandardItemModel()
        model.appendRow(_file_row('File #1', '01.09.2014'))
        model.appendRow(_folder_row('Folder #1', '01.09.2014'))
        model.appendRow(_folder_row('Folder #2', '02.09.2014'))
        model.appendRow(_file_row('File #2', '03.09.2014')) …我正在尝试重新创建 Windows 记事本。
\n\n我目前正在搞乱QMenuBar
我制作了一本字典,其中包含以下模式的所有菜单和操作:
\n\nmenus = {'File':[['New', 'Ctrl+n'],\n                 ['Open', 'Ctrl+o'],\n                 ['Save', 'Ctrl+s'],\n                 ['Save as...', None],\n                 'Separator', \n                 # and so on\n然后我迭代该字典,并成功创建菜单和操作并将它们存储在第二个字典中。
\n\n现在我正在尝试连接每个action[new, open, save, \xe2\x80\xa6] to a instance method of the same name.
我这样做是这样的:
\n\nfor action in menus[m]:\n    action = menu.addAction(action[0])\n\n    if action[1]:\n        action.setShortcut(QKeySequence(action[1]))\n\n    if isinstance(action, QAction):\n        fname = action[0].lower() \n        # and some other string manipulations\n        func = getattr(self,fname)\n        action.triggered.connect(lambda arg=action: func(arg))\n它连接成功,但如果我尝试使用任何操作,它不会执行任何操作。
\n\n我以前曾使用 lambda 函数连接操作,但这是我第一次使用 …
下面的代码创建QTableView由self.myModel( QAbstractTableModel) 驱动。“显示全部”self.checkBox链接到self.myModel.cbChanged()方法。

问题:如何修改此代码,以便在选中复选框后立即刷新“QTableView”?
目标:当选中该复选框时,我们希望显示奇数编号的项目。以及要隐藏的偶数项。当复选框关闭(未选中)时,我们希望显示偶数编号的项目。所有奇数编号的项目都被隐藏。
import sys, os
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
class TableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)      
        self.items=['One','Two','Three','Four','Five','Six','Seven']
        self.cb_status=True
    def rowCount(self, parent=QtCore.QModelIndex()):   
        return len(self.items)
    def columnCount(self, index=QtCore.QModelIndex()):
        return 1
    def data(self, index, role):
        if not index.isValid() or not (0<=index.row()<len(self.items)):
            return QtCore.QVariant()
        item=str(self.items[index.row()])
        if role==QtCore.Qt.DisplayRole and self.cb_status:
            return item
        else:
            return QtCore.QVariant()
    def cbChanged(self, arg=None):
        self.cb_status=arg  
class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        mainLayout=QtGui.QHBoxLayout()
        self.setLayout(mainLayout)   
        self.viewA=QtGui.QTableView()
        self.viewA.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) 
        self.myModel=TableModel()
        self.viewA.setModel(self.myModel)
        self.checkBox=QtGui.QCheckBox("Show All") …我可以找到一些如何使用标准模型和标准视图的示例。
http://doc.qt.io/qt-5/modelview.html
http://doc.qt.io/qt-5/qtwidgets-itemviews-simplewidgetmapper-example.html
但我就是找不到一个如何使用QAbstractModelmake my ownmodel并自行使用它的示例view/widget。
更新模型后,支架视图将更新,但我自己的视图不会更新。
完整代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from  PyQt5.QtWidgets import (QWidget, QLabel, QDataWidgetMapper,
                              QLineEdit, QApplication, QGridLayout)
from PyQt5.QtCore import QAbstractListModel, Qt
from PyQt5.QtWidgets import QListView
class Window(QWidget):
    def __init__(self, model, parent=None):
        super(Window, self).__init__(parent)
        self.model = model
        # Set up the widgets.
        nameLabel = QLabel("Na&me:")
        nameEdit = QLineEdit()
        # Set up the mapper.
        self.mapper = QDataWidgetMapper(self)
        self.mapper.setModel(self.model)
        self.mapper.addMapping(nameEdit, 0)
        layout = QGridLayout()
        layout.addWidget(nameLabel, 0, 0, 1, 1) …Wacom 没有官方的 Python SDK。尽管如此,PyQt 有一个 QTabletEvent 来处理这些平板电脑。
唉,我没有发现这方面的工作 python 示例。
可以在此处查看 C++ 示例。
任何人都可以请我参考一个python示例吗?
我正在尝试在 pycharm 中使用 PyQt4。我的代码在运行模式下完美运行,但在调试模式下,当我尝试导入 PyQt4 时出现以下错误:
“运行时错误:PyQt4.QtCore 和 PyQt5.QtCore 模块都包装了 QObject 类”
即使使用非常准系统的代码也会发生这种情况:
from PyQt4 import QtGui, QtCore
print('cheese')
(因此,这与以前的PyQt4 Pycharm 问题 w. Matplotlib 不同)
很明显,PyCharm 调试器正在使用 PyQt5(这可以通过调用 sys.modules['PyQt5'] 看到)。我怎样才能“取消导入”PyQt5,或者至少防止碰撞?
另外:我尝试以不同的方式导入以包含显式依赖项,但这也会产生错误:
import PyQt4 as pp
pp.QtGui
AttributeError: 模块“PyQt4”没有属性“QtGui”
谢谢!
创建一个 QMainWindow >> 按下开始按钮 >> 将长时间运行的函数与 QLabel 作为 arg >> 在运行长函数时更新标签。
我想更新 GUI 中长时间运行的函数的状态。但是一旦长时间运行的功能启动,整个窗口就会冻结
import sys
import time
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
)
def runLongTask(label):
    label.setText('<1> sleeping for 10s ...')
    time.sleep(10)
    label.setText('<2> sleeping for 10s ...')
    time.sleep(10)
    label.setText('End')
class Window(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
    def setupUi(self):
        self.setWindowTitle("GUI freeze FIX")
        self.resize(350, 250)
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.label = QLabel()
        self.label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.label.setText('No Update')
        countBtn = QPushButton("Start")
        countBtn.clicked.connect(lambda: runLongTask(self.label))
        layout …