我有一个固定宽度的QLabel.
我需要(定期)检查整个字符串是否适合当前宽度的QLabel内部,因此我可以适当调整它的大小.
为此,我需要获取字符串的"像素长度".
(显示字符串所需的水平像素总数).
应该注意的是,QLabel的点大小永远不会改变.
我不能简单地检查存在的字符数量,因为有些字符是下标/上标,并且对整个字符串的宽度有不同的贡献.
(这就是说像素宽度和字符数量之间没有简单的关系)
这有什么抽象的,超级便利的功能吗?
规格:
Python 2.7.1
PyQt4
Windows 7
我有一个简单的应用程序,它运行一个可以在完成之前持续几分钟的过程.所以我试图向用户提供一个指示器,它正在处理请求,例如将光标更改为沙漏.
但我不能让它正常工作.我的所有尝试都导致错误或无效.我似乎错误地调用了cursorshapes PyQt4.Qt.WaitCursor返回一个模块不包含它的错误.
向用户指示进程正在运行的正确方法是什么?
我有一个包含一些字符串的列表(其中大部分是从sqlite3数据库中获取的):
stats_list = ['Statistik \xc3\xb6ver s\xc3\xa5nger\n', 'Antal\tS\xc3\xa5ng', '1\tCarola - Betlehems Stj\xc3\xa4rna', '\n\nStatistik \xc3\xb6ver datak\xc3\xa4llor\n', 'K\xc3\xa4lla\tAntal', 'MANUAL\t1', '\n\nStatistik \xc3\xb6ver \xc3\xb6nskare\n', 'Antal\tId', u'1\tNiclas']
Run Code Online (Sandbox Code Playgroud)
当我尝试加入时:
return '\n'.join(stats_list)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
是否有可能通过查看列表得到任何线索?如果我遍历列表并将其打印到屏幕,我得到这个:
Statistik över sånger Antal Sång 1 Carola - Betlehems Stjärna Statistik över datakällor Källa Antal MANUAL 1 Statistik över önskare Antal Id 1 Niclas
这正是我所期待的,并没有显示错误.(特殊字符是瑞典语).
编辑:
我试过这个:
return '\n'.join(i.decode('utf8') for i in stats_list)
Run Code Online (Sandbox Code Playgroud)
但它回来了:
Traceback (most recent call last):
File …
Run Code Online (Sandbox Code Playgroud) 这些天我只是在学习python和Qt.所以请考虑这将是一个新手问题,但我被困在这里.
import sys
from PyQt4.QtCore import *
data1 = 'string'
data2 = QVariant(data1)
data3 = data2.toPyObject()
Run Code Online (Sandbox Code Playgroud)
我期望data3与data1,'string'相同.但是在我的系统中data3是
PyQt4.QtCore.QString(u'string')
Run Code Online (Sandbox Code Playgroud)
如果我想处理的数据很简单,例如,但是我想处理'dict'类型的数据,所以我需要解决这个问题,这不是什么大问题.
我认为这是编码问题,但找不到如何解决它.
*在每份文件中,我都声明:
#-*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud) 你好Py2中的这两个功能工作正常,但它不适用于Py3
def encoding(text, codes):
binary = ''
f = open('bytes.bin', 'wb')
for c in text:
binary += codes[c]
f.write('%s' % binary)
print('Text in binary:', binary)
f.close()
return len(binary)
def decoding(codes, large):
f = file('bytes.bin', 'rb')
bits = f.read(large)
tmp = ''
decode_text = ''
for bit in bits:
tmp += bit
if tmp in fordecodes:
decode_text += fordecodes[tmp]
tmp = ''
f.close()
return decode_text
Run Code Online (Sandbox Code Playgroud)
控制台输出:
Traceback (most recent call last):
File "Practica2.py", line 83, in <module>
large = encoding(text, codes) …
Run Code Online (Sandbox Code Playgroud) 我的PyQt应用程序不再将错误(stderr?)打印到控制台.
我使用QtDesigner并导入这样的UI:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.uic import loadUiType
Ui_MainWindow, QMainWindow = loadUiType("test.ui")
class Main(QMainWindow, Ui_MainWindow):
"""Main window"""
def __init__(self,parent=None):
super(Main, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.testfunc)
def testfunc(self):
print(9/0)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
test.ui包含QPushButton和标签.当我在非Qt应用程序中调用testfunc(显然会出现错误)时,我会收到错误消息,回溯等.当我执行此代码时,它只是退出.
之前我没有使用QtDesigner写了一个PyQt应用程序,它按预期将错误打印到控制台.与QtDesigner和继承有什么区别?
当我尝试为Python-3.6安装PySide时,它说它只能在Python-3.4之前兼容.是否有任何解决方法为Python-3.6安装它?
似乎只支持这些Python版本:
[(2, 6), (2, 7), (3, 2), (3, 3), (3, 4)].
Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的问题,但我试图在我的应用程序中为特定的QLabel赋予颜色,但它不起作用.
我尝试的代码如下:
nom_plan_label = QtGui.QLabel()
nom_plan_label.setText(nom_plan_vignette)
nom_plan_label.setStyleSheet("QLabel#nom_plan_label {color: yellow}")
Run Code Online (Sandbox Code Playgroud)
任何提示都将不胜感激
当客户询问我是否可以在应用程序启动时实现某种登录表单时,我几乎完成了我的应用程序.
到目前为止,我已经设计了UI,并对实际执行进行了修改.用户名和密码暂时无关紧要.
class Login(QtGui.QDialog):
def __init__(self,parent=None):
QtGui.QWidget.__init__(self,parent)
self.ui=Ui_dlgLogovanje()
self.ui.setupUi(self)
QtCore.QObject.connect(self.ui.buttonLogin, QtCore.SIGNAL("clicked()"), self.doLogin)
def doLogin(self):
name = str(self.ui.lineKorisnik.text())
passwd = str(self.ui.lineSifra.text())
if name == "john" and passwd =="doe":
self.runIt()
else:
QtGui.QMessageBox.warning(self, 'Greška',
"Bad user or password", QtGui.QMessageBox.Ok)
def runIt(self):
myprogram = Window()
myprogram.showMaximized() #myprogram is
class Window(QtGui.QMainWindow):
def __init__(self,parent=None):
QtGui.QWidget.__init__(self,parent)
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
if __name__=="__main__":
program = QtGui.QApplication(sys.argv)
myprogram = Window()
if Login().exec_() == QtGui.QDialog.Accepted:
sys.exit(program.exec_())
Run Code Online (Sandbox Code Playgroud)
登录表单显示.如果输入了正确的用户名和密码,则会显示主窗口并正常工作.但是,登录表单保持活动状态,如果我关闭它,主窗口也将关闭.
我需要找到一种方法来将输入光栅图像(例如jpg)重新调整为指定的宽度/高度分辨率(以像素为单位).如果在调整新图像大小时PyQt会保持原始图像的纵横比(因此没有拉伸而只是缩放)会很棒.
src ='/ Users/usrName/images/originalImage.jpg'(2048x1024)(矩形图像2:1比例)dest ='/ Usrs/usrName/images/originalImage_thumb.jpg'(64x64)(输出图像为方形1:1)比).
提前致谢!
...可用于调整大小并将图像转换为QT支持的任何格式到目前为止...例如:'bmp','gif','jpg','jpeg','png','pbm', 'tiff','svg','xbm'
def resizeImageWithQT(src, dest):
pixmap = QtGui.QPixmap(src)
pixmap_resized = pixmap.scaled(720, 405, QtCore.Qt.KeepAspectRatio)
if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest))
pixmap_resized.save(dest)
Run Code Online (Sandbox Code Playgroud) python ×9
pyqt ×7
pyqt4 ×4
pyqt5 ×2
qlabel ×2
unicode ×2
aspect-ratio ×1
bytearray ×1
cursor ×1
dialog ×1
image ×1
installation ×1
login ×1
pycharm ×1
pyside ×1
pyside2 ×1
python-3.6 ×1
python-3.x ×1
qt ×1
qt-designer ×1
qvariant ×1
resize ×1
string ×1
width ×1