小编ekh*_*oro的帖子

PyQt:如何自定义ComboBox项目显示

是否可以先创建一个ComboBox项,然后设置其显示属性(例如项目的背景颜色,图标,字体颜色,字体大小等,然后使用Comobobox的.addItem()方法将其添加到ComboBox?原样是现在我被困了:

myCombobox = QtGui.QComboBox
for i in range(10):
    myCombobox.addItem(str(i))
Run Code Online (Sandbox Code Playgroud)

不用说,这种方法几乎没有空间来定制各个ComboBox的项目显示属性.我想要的是这样的:

myCombobox = QtGui.QComboBox
for i in range(10):
    item = comboboxItem()
    item.setColor(allBlueAndShiny)
    font = QtGui.QFont()
    font.setPointSize(10)
    item.setFont(font)

    # Only after item was set with all display properties it is added:        
    myCombobox.addItem(str(i))
Run Code Online (Sandbox Code Playgroud)

稍后编辑

以下是QCombobox定制项目的工作示例.谢谢Ekhumoro!


from PyQt4 import QtGui, QtCore

def main():
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QWidget()
    main_layout = QtGui.QVBoxLayout()
    # QComboBox
    combo = QtGui.QComboBox()
    model = combo.model()
    for row in range(10):
        item = QtGui.QStandardItem(str(row))
        item.setForeground(QtGui.QColor('red'))
        font = item.font()
        font.setPointSize(10)
        item.setFont(font)
        model.appendRow(item) …
Run Code Online (Sandbox Code Playgroud)

python qt pyqt qcombobox

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

使用 qt 创建透明叠加层

我最近一直在学习 python,现在我想(尝试)创建我的第一个真正的应用程序,一个适用于 Linux 的字幕播放器。到目前为止,我一直在使用 Greenfish 字幕播放器,它是针对 Windows 用户的,在 Linux 中不能正常工作。

我想在 qt 中创建应用程序,因为我发现在 tkinter 中无法使用透明窗口,但是如果有人知道更好的框架,请提出建议!

现在在开始之前,我已经研究了几个小时的网络,以发现如何让我的应用程序显示在全屏 Flash 视频上,这似乎是不可能的。然而,前面提到的 GF 字幕播放器在 Windows 中设法这样做,但在 Linux 中却没有(也许也是因为它通过 wine 运行)。

所以我的问题是有没有可能创建一个透明的应用程序,保留在全屏 Flash 视频上,如果是这样,你能指出我正确的方向吗?

提前致谢。

编辑:这里有一些我一直在尝试的示例代码。这段代码产生的窗口不会停留在全屏视频之上

import sys
from PyQt4 import QtGui, QtCore

class mymainwindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)

app = QtGui.QApplication(sys.argv)
mywindow = mymainwindow()
mywindow.show()
app.exec_()
mywindow.show()
Run Code Online (Sandbox Code Playgroud)

python window pyqt4 stayontop

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

退出时'QThread:在线程仍在运行时被销毁'

我正试图找到一种方法来正确退出我的应用程序.当我退出时,我收到一个错误说QThread: Destroyed while thread is still running.我有一个线程用于输出输出到QTextBrowser.什么应该是正确的退出方式?这是我得到的:

class LogReceiver(QtCore.QObject):
    mysignal = QtCore.Signal(str)

    def __init__(self, queue, *args, **kwargs):
        QtCore.QObject.__init__(self, *args, **kwargs)
        self.queue = queue

    def run(self):
        while True:
            text = self.queue.get()
            self.mysignal.emit(text)

if __name__ == '__main__':
    queue = Queue()
    thread = QtCore.QThread()
    my_receiver = MyReceiver(queue)

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    my_receiver.mysignal.connect(window.append_text)
    my_receiver.moveToThread(thread)
    thread.started.connect(my_receiver.run)
    thread.start()

    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

thread退出时应该以某种方式终止?请注意self.queue.get()块和等待文本.

谢谢

python qt multithreading pyqt pyside

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

嵌套类与范围

我是编程新手.首先,以下是我的代码:

x = 11

def f():
    x = 22
    print(x)
    class C:
        print(x)

f()
Run Code Online (Sandbox Code Playgroud)

我得到三个打印结果,"22 22",作为输出.当我改变我的代码时:

x = 11

def f():
    x = 22
    print(x)
    class C:
        print(x)
        x = 33
        print(x)

f()
Run Code Online (Sandbox Code Playgroud)

我得到了"22 11 33",而不是我所期待的:"22 22 33".

看起来当我x在嵌套类中添加局部时,变量搜索的顺序会发生变化.我相信还有一些关于范围的技巧我还不知道.任何人都可以向我解释这个吗?

python scope

5
推荐指数
0
解决办法
48
查看次数

暂停工作线程并等待主线程中的事件

我们有一个执行不同查询的应用程序.它最多启动四个线程,并在它们上运行提取.

那部分看起来像这样:

    if len(self.threads) == 4:
        self.__maxThreadsMsg(base)
        return False
    else:
        self.threads.append(Extractor(self.ui, base))
        self.threads[-1].start()
        self.__extractionMsg(base)
        return True
Run Code Online (Sandbox Code Playgroud)

我们的Extractor类继承QThread:

class Extractor(QThread):
    def init(self, ui, base):
        QThread.__init__(self)
        self.ui = ui
        self.base = base

    def run(self):
        self.run_base(base)
Run Code Online (Sandbox Code Playgroud)

self.ui设置为Ui_MainWindow():

class Cont(QMainWindow):
    def __init__(self, parent=None):
        QWidget.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
Run Code Online (Sandbox Code Playgroud)

在继续之前,有一个特定的基础将数据发送给用户(返回主窗口)(在这种情况下,带有两个按钮的弹出窗口):

#This code is in the main file inside a method, not in the Extractor class
msg_box = QMessagebox()
msg_box.setText('Quantity in base: '.format(n))
msg_box.setInformativeText('Would you like to continue?') …
Run Code Online (Sandbox Code Playgroud)

python multithreading signals-slots pyqt4 python-2.7

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

停止shutil.make_archive 向自身添加存档

我在Appdir 里面有Releasedir

$ cd Release
$ tree
.
`-- App
    |-- App.exe
    ..........
Run Code Online (Sandbox Code Playgroud)

我试图App-1.0.zipRelease包含App所有内容的目录中创建。那是在解包之后App-1.0.zip我会得到这个App目录。

我试过了,shutil.make_archive但是当我这样做时

import shutil

shutil.make_archive('App-1.0', 'zip', '.')
Run Code Online (Sandbox Code Playgroud)

Release目录,我得到48字节App-1.0.zipApp-1.0.zip除了App目录。也就是说,它将这个未完成的档案添加到自己身上。

除了在临时目录中创建存档并移动之外,有没有办法避免这种情况?

我试图设置base_dir和使用App作为root_dir

shutil.make_archive('App-1.0', 'zip', 'App', 'App')
Run Code Online (Sandbox Code Playgroud)

但是我App在设置时遇到了未找到的错误base_dir

Traceback (most recent call last):
  File ".......archive.py", line 4, in <module>
    shutil.make_archive('App-1.0', 'zip', 'App', 'App')
  File "C:\Users\Alex\.virtualenvs\....-nAKWzegL\lib\shutil.py", line 800, …
Run Code Online (Sandbox Code Playgroud)

python archive shutil python-3.x

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

在“ PyQt4”对话框中添加“最大化”按钮,并使对话框居中于父窗口的中心

我有一个带有大文本框的对话框。我希望用户能够最大化对话框。我已经尝试了以下选项(XML_Editor是一个QDialog实例):

XML_Editor.setWindowFlags(QtCore.Qt.Window or QtCore.Qt.WindowMaximizeButtonHint) -显示最大化按钮,但不再使对话框居中

XML_Editor.setWindowFlags(QtCore.Qt.Dialog or QtCore.Qt.WindowMaximizeButtonHint or QtCore.Qt.CustomizeWindowHint) - 没有效果

现在我的问题是:如何实现显示“最大化”按钮,并且在父级居中居中弹出对话框?网络上的大多数资源似乎都集中在如何摆脱“最大化”按钮上。任何想法如何实现相反?

主要目标是Ubuntu 10.04(默认配置),如果它也可以在Windows和Mac上运行,那就太好了。

我感谢任何提示。提前致谢。

ubuntu dialog qt4 pyqt pyqt4

4
推荐指数
1
解决办法
4028
查看次数

将用户交互与程序化改变分开:PyQt,QComboBox

我的PyQt4/Python3 GUI中有几个QComboBox,它们在初始化期间填充了数据库中的一些条目.初始CurrentIndex设置为0.还有一个复选框,用于更改组合框中项目的语言.为了保留当前用户选择,我在用已翻译项填充ComboBox后,将当前项的索引和setCurrentIndex备份到此数字.所有这些操作都会发出currentIndexChanged信号.

根据QComboBoxes中选择的项目,显示一些图表.我们的想法是在线重绘图表 - 只要用户更改任何ComboBox当前项目.在这里我遇到了一个问题,因为如果我每次重写信号currentIndexChanged时都会重绘图,我会在初始化期间重新绘制它几次并且如果更改了翻译复选框选项.

分离这些案件的最佳方法是什么?原则上我需要将程序化的当前索引更改与用户分开,并且仅在稍后的情况下更新绘图(在GUI初始化期间,我可以以编程方式调用更新绘图函数一次).我应该写/重写任何信号吗?如果是这样,我以前从未这样做,并欢迎任何提示或一个好例子.用另一个信号?或者也许有办法暂时阻止所有信号?

pyqt signals-slots pyqt4 qcombobox python-3.x

4
推荐指数
1
解决办法
1万
查看次数

PyQt中的悬停问题

我想要悬停.我看了一个例子然后编写了一个脚本,它将在我制作程序时使用.我面临一个问题,只有当你将鼠标放在按钮的左上角时才会发生悬停.我希望它会发生在所有按钮上,如果我移动光标按钮然后它应该改变.

这是我的代码:

from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import pyqtSignal
import os,sys

class HoverButton(QtGui.QToolButton):
    def enterEvent(self,event):
        print("Enter")
        button.setStyleSheet("background-color:#45b545;")

    def leaveEvent(self,event):
        button.setStyleSheet("background-color:yellow;")
        print("Leave")

app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
button = QtGui.QToolButton(widget)
button.setMouseTracking(True)
buttonss =  HoverButton(button)
button.setIconSize(QtCore.QSize(200,200))
widget.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

python pyqt hover pyqt4

4
推荐指数
1
解决办法
5628
查看次数

在 Python (PyQt) 中创建 QR 码

我目前正在使用 PyQt4 和qrcode4.0.4

from PyQt4 import QtGui, QtCore
from PIL.ImageQt import ImageQt
import qrcode

class QRLabel(QtGui.QLabel):
    def __init__(self, text=""):
        super(QRLabel, self).__init__()
        self.setCode(text)

    def setCode(self, text=""):        
        self.text = text      
        qrImg = qrcode.make(text)
        imgQt = ImageQt(qrImg.convert("RGB"))   # keep a reference!
        pixm = QtGui.QPixmap.fromImage(imgQt)
        self.setPixmap(pixm.scaled(self.size(),QtCore.Qt.KeepAspectRatio))
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在屏幕上显示图像之前需要克服几个障碍。QR 代码以 RGBA PIL 图像开始,转换为 RGB,然后转换为 PIL ImageQt 对象,然后转换为 QPixmap,然后将其放置在具有缩放修复的 QLabel 上。

如果您没有显式存储 imgQt 引用,则在加载小部件时会得到垃圾。

我的问题:我可以做些什么来改善这一点,因为似乎涉及很多转换。

python qr-code pyqt qpixmap python-imaging-library

4
推荐指数
1
解决办法
3733
查看次数