Найти - Пользователи
Полная версия: QLineEdit - ввод с разделителями тысяч
Начало » GUI » QLineEdit - ввод с разделителями тысяч
1 2
villager
Доброго времени суток.

помогите ввести деньги :)

переползаю с foxpro - там было просто - шаблон типа “999'999'999'999.99”
poltergeist
http://doc.qtsoftware.com/4.5/qlineedit.html#inputMask-prop
line_edit.setInputMask("999,999,999,999.99")
– тока не уверен что это будет удобно для ввода, мне лично эта фича не очень нравится, может в Qt она просто не до конца проработана.

Этот вариант мне больше нравится: http://doc.qtsoftware.com/4.5/qlineedit.html#setValidator
line_edit.setValidator(QtGui.QDoubleValidator(0, 999999999999.99, 2, line_edit))
villager
poltergeist
line_edit.setInputMask(“999,999,999,999.99”)
пробовал
у меня цифры вводятся с левым смещением: 123,56 , , .12
несмотря на правильный alignment
пока использую validator:
"^?({1}{0,}(\.{0,2})?|0(\.{0,2})?|\.{1,2})$"
нарыл на http://regexlib.com
видно придется напильником доделывать QLineEdit
villager
не прошло и полгода, дошли руки до напильника :)

# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import PyQt4.Qt
import sys

def tran(num, pic):
if len(pic)==0: return num
out=""
outdec=""
#уберем не цифры
newnum=""
for i in num:
if str(i) in "-0123456789.": newnum+=i
num=newnum
if "." in num:#делим число
dec=num.split(".")[1]
num=num.split(".")[0]
else: dec=""
if "." in pic:#делим шаблон
picdec="."+pic.split(".")[1]
pic=pic.split(".")[0]
else: picdec=""
#делим целые
j=len(num)-1
for i in range(len(pic)-1,-1 ,-1):
if j>=0:
if pic[i]=="9":
out=num[j]+out
j-=1;
else:
out=pic[i]+out
#делим десятые
j=0
for i in range(0, len(picdec)):
if picdec[i]=="9":
if j<len(dec):
outdec+=dec[j]
j+=1;
else:
outdec+="0";
else:
outdec+=picdec[i]
return out+outdec


class zzLineEdit(QLineEdit):
type="lineedit"
def __init__(self, txt="",pic=""):
txt=u"%s" % txt
self.pic=pic.strip()
if self.pic<>"":
txt=tran(txt, pic)
if "." in self.pic:
self.DECIMAL_POINT_POS=len(self.pic.split(".")[1])
else:
self.DECIMAL_POINT_POS=0
QLineEdit.__init__(self, txt)
if self.pic<>"":
self.setAlignment(Qt.AlignRight)
self.textEdited.connect(self.on_textEdited)
self.escapePressed=False
def event(self, ev):
if ev.type()==QEvent.ShortcutOverride:
if ev.key()==Qt.Key_Escape:
self.escapePressed=True
return QLineEdit.event(self, ev)
def keyPressEvent(self, ev):
if ev.key() in [Qt.Key_Enter, Qt.Key_Return]:
ev.accept()
self.focusNextChild()
else:
if self.pic<>"": self.picMake(ev)
else: QLineEdit.keyPressEvent(self, ev)
def on_textEdited ( self, _txt ) :
prevtext=QLineEdit.text(self)
cur_pos_left=len(prevtext)-self.cursorPosition()
self.setText(tran(_txt.replace(",", ""), self.pic))
if QLineEdit.text(self)=="."+"0"*self.DECIMAL_POINT_POS: cur_pos_left=len(QLineEdit.text(self))
if cur_pos_left>self.DECIMAL_POINT_POS:
self.setCursorPosition (len(QLineEdit.text(self))-cur_pos_left)
else:
self.setCursorPosition (len(QLineEdit.text(self))-cur_pos_left+1)
def setText(self, txt):
if len(self.pic)>0: txt=tran(txt, self.pic)
QLineEdit.setText(self, txt)
def valid(self): return True
def text(self):
txt=QLineEdit.text(self)
if len(self.pic)==0: return txt
#уберем не цифры
newnum=""
for i in txt:
if str(i) in "-0123456789.":newnum+=i
return newnum
def picMake(self, event):
key = event.key()
text=str(QLineEdit.text(self))
selected_text=self.selectedText()
curpos=self.cursorPosition()
was_modifiers=False if event.modifiers() in [Qt.NoModifier,Qt.KeypadModifier ] else True
if curpos==0 and len(text)>0:
if text[curpos]=="-":
self.setCursorPosition(curpos+1)
if key==Qt.Key_Period:
if curpos<(len(text)-self.DECIMAL_POINT_POS):
self.setCursorPosition(len(text)-self.DECIMAL_POINT_POS)
else:
self.setCursorPosition(len(text)-self.DECIMAL_POINT_POS-1)
return
if key==Qt.Key_Minus:
if len(text)>0:
if text[0]=="-":
self.setText(text[1:])
curpos-=1
else:
self.setText("-"+text)
curpos+=1
else:
self.setText("-"+text)
curpos+=1
self.setCursorPosition(curpos)
return
if event.modifiers() == Qt.NoModifier :
if key in [Qt.Key_Backspace,Qt.Key_Delete] and (self.hasSelectedText()==False):
cur_pos_left = len(text)-self.cursorPosition()
if key==Qt.Key_Backspace:
if len(text)==0:
return
if cur_pos_left<=self.DECIMAL_POINT_POS-1:
text=text[:curpos-1]+text[curpos:]
self.setText(text+"0")
self.setCursorPosition(curpos-1)
return
elif (cur_pos_left<=self.DECIMAL_POINT_POS and self.DECIMAL_POINT_POS>0) or \
text[curpos-1]==',':
self.setCursorPosition(curpos-1)
elif key == Qt.Key_Delete:
if cur_pos_left<=self.DECIMAL_POINT_POS+1 and cur_pos_left<>0 and self.DECIMAL_POINT_POS>0:
if cur_pos_left==self.DECIMAL_POINT_POS+1: curpos+=1
text=text[:curpos]+text[curpos+1:]
self.setText(text+"0")
self.setCursorPosition(curpos)
return
QLineEdit.keyPressEvent(self,event)
if "." in selected_text and not was_modifiers:
self.setCursorPosition(len(QLineEdit.text(self))-self.DECIMAL_POINT_POS-1)


if __name__ == "__main__":
app = QApplication(sys.argv)
MyApp = QApplication(sys.argv)
w=zzLineEdit("-1123456.1234", "999,99,99,999.9999")
w.setFont(QFont("Arial Bold", 54))
w.show()
sys.exit(app.exec_())
может уже есть более оптимальные решения?
или тут можно что упростить?
Kyrym
По данному вопросу не появилось более красивого решения?
Конкретно меня интересует разделитель тысяч для целых и вещественных чисел при вводе в QLineEdit.
Чтобы в поле вводились такие числа:
1 234
18 654.42
59 854 145
doza_and
villager
может уже есть более оптимальные решения?
или тут можно что упростить?

Конечно есть. Вы можете писать 123_445_64, это стандартные литералы начиная с питона 3.6
Если вам так уж нужно отделять куски, то логично их поместить в отдельные поля.

Придумывать формат не соответствующий стандартным соглашениям плохо. Непонятно что можно будет вводить а что нет, нельзя будет копировать литерал в другое приложение и т.п.

       #уберем не цифры
newnum=""
for i in txt:
if str(i) in "-0123456789.":newnum+=i
Очевидно плохое решение. Гораздо лучше написать полноценный парсер.
Kyrym
doza_and
Конечно есть. Вы можете писать 123_445_64, это стандартные литералы начиная с питона 3.6
К сожалению, последняя портабельная версия питона с qt4 - это 3.3.
doza_and
Придумывать формат не соответствующий стандартным соглашениям плохо
То что я спрашиваю нестандартно? Даже в калькуляторах (не ПК) есть такая функция. В экселе эта фича включается без проблем, а в мега крутом питоне с тысячами классов этого нету?

FishHook
Kyrym
Вы сформируйте вопрос уже правильно. Вам надо чтобы пользователь п программе на Qt видел цифры с разделителями или чтобы внутри программы на питоне были такие цифры?
Kyrym
FishHook
Вы сформируйте вопрос уже правильно. Вам надо чтобы пользователь п программе на Qt видел цифры с разделителями или чтобы внутри программы на питоне были такие цифры?
Мне нужно, чтобы пользователь, запустив программу pyqt и заполняя поле QLineEdit неким числом, видел, как программа автоматически разбивает данное число пробелами на тысячи для визуальной ясности, вот так:
1 234
18 654.42
59 854 145
Потом это число пойдёт в расчёты.

У меня есть мысль, как написать функцию для этого, однако, хотелось бы использовать стандартный метод.

FishHook
Kyrym
Мне нужно, чтобы пользователь, запустив программу pyqt и заполняя поле QLineEdit неким числом, видел, как программа автоматически разбивает данное число пробелами на тысячи для визуальной ясности
Kyrym
В экселе эта фича включается без проблем, а в мега крутом питоне с тысячами классов этого нету?

Ну и как вашу истерику понимать то? Во-первых, Qt - это С++ библиотека, не питонья. Во-вторых, даже если бы это было так, то как язык программирования связан с отображением данных в GUI форме? Вам надо немного охладить пыл, разобраться с тем, что вы вообще используете и какова роль каждого компонента в этой цепочке python -> pyQt -> Qt. Тогда вы отделите мух от котлет, научитесь пользоваться справкой по Qt и откроете для себя Qt designer, который решит 95% ваших проблем с поиском нужной проперти для контрола.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB