- changed the syntax highlighting for the AppTextEditor such that the strings are not color marked
- changed the syntax highlighting such that for a dark theme the colors are inverted - made sure that in the AppTextEditor, when a line is highlighted then the text foreground color is black such that the writing can be read over the line highlight
This commit is contained in:
@@ -7,6 +7,12 @@ CHANGELOG for FlatCAM Evo beta
|
|||||||
|
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
12.05.2022
|
||||||
|
|
||||||
|
- changed the syntax highlighting for the AppTextEditor such that the strings are not color marked
|
||||||
|
- changed the syntax highlighting such that for a dark theme the colors are inverted
|
||||||
|
- made sure that in the AppTextEditor, when a line is highlighted then the text foreground color is black such that the writing can be read over the line highlight
|
||||||
|
|
||||||
11.05.2022
|
11.05.2022
|
||||||
|
|
||||||
- fixed a crash when creating a Document object due of changes in Qt6 (missing QtGui.Qt)
|
- fixed a crash when creating a Document object due of changes in Qt6 (missing QtGui.Qt)
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class AppTextEditor(QtWidgets.QWidget):
|
|||||||
|
|
||||||
# CODE Editor
|
# CODE Editor
|
||||||
if self.plain_text:
|
if self.plain_text:
|
||||||
self.editor_class = FCTextAreaLineNumber(color_dict=color_dict)
|
self.editor_class = FCTextAreaLineNumber(color_dict=color_dict, theme=self.app.options['global_theme'])
|
||||||
self.code_editor = self.editor_class.edit
|
self.code_editor = self.editor_class.edit
|
||||||
|
|
||||||
sel_color = 'black'
|
sel_color = 'black'
|
||||||
|
|||||||
@@ -4922,10 +4922,12 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
and from here: https://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html
|
and from here: https://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, *args, color_dict=None):
|
def __init__(self, *args, color_dict=None, theme='default'):
|
||||||
FCPlainTextAreaExtended.__init__(self, *args)
|
FCPlainTextAreaExtended.__init__(self, *args)
|
||||||
|
|
||||||
self.color_storage = color_dict if color_dict else {}
|
self.color_storage = color_dict if color_dict else {}
|
||||||
|
self.theme = theme
|
||||||
|
|
||||||
|
|
||||||
# self.setFrameStyle(QFrame.NoFrame)
|
# self.setFrameStyle(QFrame.NoFrame)
|
||||||
self.setFrameStyle(QtWidgets.QFrame.Shape.NoFrame)
|
self.setFrameStyle(QtWidgets.QFrame.Shape.NoFrame)
|
||||||
@@ -4933,13 +4935,14 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# self.setLineWrapMode(QPlainTextEdit.NoWrap)
|
# self.setLineWrapMode(QPlainTextEdit.NoWrap)
|
||||||
self.cursorPositionChanged.connect(self.highlight)
|
self.cursorPositionChanged.connect(self.highlight)
|
||||||
|
|
||||||
self.highlighter = self.MyHighlighter(self.document())
|
self.highlighter = self.MyHighlighter(parent=self.document(), theme=self.theme)
|
||||||
|
|
||||||
class MyHighlighter(QtGui.QSyntaxHighlighter):
|
class MyHighlighter(QtGui.QSyntaxHighlighter):
|
||||||
|
|
||||||
def __init__(self, parent, highlight_rules=None):
|
def __init__(self, parent, theme, highlight_rules=None):
|
||||||
QtGui.QSyntaxHighlighter.__init__(self, parent)
|
QtGui.QSyntaxHighlighter.__init__(self, parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
self.theme = theme
|
||||||
self.highlightingRules = []
|
self.highlightingRules = []
|
||||||
|
|
||||||
if highlight_rules is None:
|
if highlight_rules is None:
|
||||||
@@ -4953,32 +4956,55 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
singleQuotedString = QtGui.QTextCharFormat()
|
singleQuotedString = QtGui.QTextCharFormat()
|
||||||
x_chars = QtGui.QTextCharFormat()
|
x_chars = QtGui.QTextCharFormat()
|
||||||
y_chars = QtGui.QTextCharFormat()
|
y_chars = QtGui.QTextCharFormat()
|
||||||
|
|
||||||
comment = QtGui.QTextCharFormat()
|
comment = QtGui.QTextCharFormat()
|
||||||
|
|
||||||
# comment
|
# comment
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("\(.*\)")
|
pattern = QtCore.QRegularExpression("\(.*\)")
|
||||||
comment.setForeground(brush)
|
comment.setForeground(brush)
|
||||||
rule = (pattern, comment)
|
rule = (pattern, comment)
|
||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# Marlin comment
|
# Marlin comment
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("^;\s*.*$")
|
pattern = QtCore.QRegularExpression("^;\s*.*$")
|
||||||
comment.setForeground(brush)
|
comment.setForeground(brush)
|
||||||
rule = (pattern, comment)
|
rule = (pattern, comment)
|
||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# Python comment
|
# Python comment
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("^\#\s*.*$")
|
pattern = QtCore.QRegularExpression("^\#\s*.*$")
|
||||||
comment.setForeground(brush)
|
comment.setForeground(brush)
|
||||||
rule = (pattern, comment)
|
rule = (pattern, comment)
|
||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
|
# string
|
||||||
|
color = self.get_custom_color(QtGui.QColor("tomato"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
|
pattern = QtCore.QRegularExpression("\".*\"")
|
||||||
|
# pattern.setMinimal
|
||||||
|
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
||||||
|
string.setForeground(brush)
|
||||||
|
rule = (pattern, string)
|
||||||
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
|
# singleQuotedString
|
||||||
|
pattern = QtCore.QRegularExpression("\'.*\'")
|
||||||
|
# pattern.setMinimal(True)
|
||||||
|
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
||||||
|
|
||||||
|
singleQuotedString.setForeground(brush)
|
||||||
|
rule = (pattern, singleQuotedString)
|
||||||
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
keyword = QtGui.QTextCharFormat()
|
keyword = QtGui.QTextCharFormat()
|
||||||
# keyword
|
# keyword
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.blue, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.blue))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword.setForeground(brush)
|
keyword.setForeground(brush)
|
||||||
keyword.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["G", "T"]
|
keywords = ["G", "T"]
|
||||||
@@ -4990,7 +5016,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
|
|
||||||
keyword1 = QtGui.QTextCharFormat()
|
keyword1 = QtGui.QTextCharFormat()
|
||||||
# keyword 1
|
# keyword 1
|
||||||
brush = QtGui.QBrush(QtGui.QColor("teal"), Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("teal"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword1.setForeground(brush)
|
keyword1.setForeground(brush)
|
||||||
keyword1.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword1.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["F"]
|
keywords = ["F"]
|
||||||
@@ -5003,7 +5030,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# keyword 2
|
# keyword 2
|
||||||
keyword2 = QtGui.QTextCharFormat()
|
keyword2 = QtGui.QTextCharFormat()
|
||||||
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
||||||
brush = QtGui.QBrush(QtGui.QColor("coral"), Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("coral"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword2.setForeground(brush)
|
keyword2.setForeground(brush)
|
||||||
keyword2.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword2.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["M"]
|
keywords = ["M"]
|
||||||
@@ -5016,7 +5044,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# keyword 3
|
# keyword 3
|
||||||
keyword3 = QtGui.QTextCharFormat()
|
keyword3 = QtGui.QTextCharFormat()
|
||||||
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
||||||
brush = QtGui.QBrush(QtGui.QColor("purple"), Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("purple"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword3.setForeground(brush)
|
keyword3.setForeground(brush)
|
||||||
keyword3.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword3.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["Z"]
|
keywords = ["Z"]
|
||||||
@@ -5028,7 +5057,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
|
|
||||||
keyword4 = QtGui.QTextCharFormat()
|
keyword4 = QtGui.QTextCharFormat()
|
||||||
# keyword 4
|
# keyword 4
|
||||||
brush = QtGui.QBrush(QtGui.QColor("green"), Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("green"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword4.setForeground(brush)
|
keyword4.setForeground(brush)
|
||||||
keyword4.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword4.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["LPC", "LPD"]
|
keywords = ["LPC", "LPD"]
|
||||||
@@ -5041,7 +5071,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# keyword 5
|
# keyword 5
|
||||||
keyword5 = QtGui.QTextCharFormat()
|
keyword5 = QtGui.QTextCharFormat()
|
||||||
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
# SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference
|
||||||
brush = QtGui.QBrush(QtGui.QColor("red"), Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("red"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
keyword5.setForeground(brush)
|
keyword5.setForeground(brush)
|
||||||
keyword5.setFontWeight(QtGui.QFont.Weight.Bold)
|
keyword5.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["D"]
|
keywords = ["D"]
|
||||||
@@ -5054,15 +5085,19 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# reservedClasses
|
# reservedClasses
|
||||||
reservedClasses.setForeground(brush)
|
reservedClasses.setForeground(brush)
|
||||||
reservedClasses.setFontWeight(QtGui.QFont.Weight.Bold)
|
reservedClasses.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
keywords = ["array", "character", "complex", "data.frame", "double", "factor",
|
keywords = [
|
||||||
"function", "integer", "list", "logical", "matrix", "numeric", "vector"]
|
"array", "character", "complex", "data.frame", "double", "factor",
|
||||||
|
"function", "integer", "list", "logical", "matrix", "numeric", "vector", "for", "if", "then",
|
||||||
|
"elif", "else", "in", "while", "do"
|
||||||
|
]
|
||||||
for word in keywords:
|
for word in keywords:
|
||||||
pattern = QtCore.QRegularExpression("\\b" + word + "\\b")
|
pattern = QtCore.QRegularExpression("\\b" + word + "\\b")
|
||||||
rule = (pattern, reservedClasses)
|
rule = (pattern, reservedClasses)
|
||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# parameter
|
# parameter
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.darkBlue))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("\-[0-9a-zA-Z_]*\s")
|
pattern = QtCore.QRegularExpression("\-[0-9a-zA-Z_]*\s")
|
||||||
parameterOperator.setForeground(brush)
|
parameterOperator.setForeground(brush)
|
||||||
parameterOperator.setFontWeight(QtGui.QFont.Weight.Bold)
|
parameterOperator.setFontWeight(QtGui.QFont.Weight.Bold)
|
||||||
@@ -5077,7 +5112,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# specialConstant
|
# specialConstant
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.green, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("green"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
specialConstant.setForeground(brush)
|
specialConstant.setForeground(brush)
|
||||||
keywords = ["Inf", "NA", "NaN", "NULL"]
|
keywords = ["Inf", "NA", "NaN", "NULL"]
|
||||||
for word in keywords:
|
for word in keywords:
|
||||||
@@ -5100,26 +5136,9 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
# rule = (pattern, number)
|
# rule = (pattern, number)
|
||||||
# self.highlightingRules.append(rule)
|
# self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# string
|
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.red, Qt.BrushStyle.SolidPattern)
|
|
||||||
pattern = QtCore.QRegularExpression("\".*\"")
|
|
||||||
# pattern.setMinimal
|
|
||||||
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
|
||||||
string.setForeground(brush)
|
|
||||||
rule = (pattern, string)
|
|
||||||
self.highlightingRules.append(rule)
|
|
||||||
|
|
||||||
# singleQuotedString
|
|
||||||
pattern = QtCore.QRegularExpression("\'.*\'")
|
|
||||||
# pattern.setMinimal(True)
|
|
||||||
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
|
||||||
|
|
||||||
singleQuotedString.setForeground(brush)
|
|
||||||
rule = (pattern, singleQuotedString)
|
|
||||||
self.highlightingRules.append(rule)
|
|
||||||
|
|
||||||
# X coordinate
|
# X coordinate
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("forestgreen"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("X")
|
pattern = QtCore.QRegularExpression("X")
|
||||||
# pattern.setMinimal(True)
|
# pattern.setMinimal(True)
|
||||||
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
||||||
@@ -5130,7 +5149,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
self.highlightingRules.append(rule)
|
self.highlightingRules.append(rule)
|
||||||
|
|
||||||
# Y coordinate
|
# Y coordinate
|
||||||
brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern)
|
color = self.get_custom_color(QtGui.QColor("forestgreen"))
|
||||||
|
brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern)
|
||||||
pattern = QtCore.QRegularExpression("Y")
|
pattern = QtCore.QRegularExpression("Y")
|
||||||
# pattern.setMinimal(True)
|
# pattern.setMinimal(True)
|
||||||
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption)
|
||||||
@@ -5169,6 +5189,33 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
|
|
||||||
self.setCurrentBlockState(0)
|
self.setCurrentBlockState(0)
|
||||||
|
|
||||||
|
def get_custom_color(self, orig_color):
|
||||||
|
"""
|
||||||
|
Invert a given color in hexa format: #RRGGBB
|
||||||
|
|
||||||
|
:param orig_color: color in the format #RRGGBB or QtGui.QColor
|
||||||
|
:type orig_color: str | QtGui.QColor
|
||||||
|
:return: inverted color
|
||||||
|
:rtype: QtGui.QColor
|
||||||
|
"""
|
||||||
|
if self.theme in ['default', 'light']:
|
||||||
|
return orig_color
|
||||||
|
|
||||||
|
if isinstance(orig_color, str):
|
||||||
|
lowered_color = orig_color.lower()
|
||||||
|
elif isinstance(orig_color, QtGui.QColor):
|
||||||
|
lowered_color = str(orig_color.name()).lower()
|
||||||
|
else: #
|
||||||
|
return orig_color
|
||||||
|
|
||||||
|
# in the "dark" theme we invert the color
|
||||||
|
group1 = "#0123456789abcdef"
|
||||||
|
group2 = "#fedcba9876543210"
|
||||||
|
# create color dict
|
||||||
|
color_dict = {group1[i]: group2[i] for i in range(len(group1))}
|
||||||
|
new_color = ''.join([color_dict[j] for j in lowered_color])
|
||||||
|
return QtGui.QColor(new_color)
|
||||||
|
|
||||||
# def format_text_color(self):
|
# def format_text_color(self):
|
||||||
# cursor = self.textCursor()
|
# cursor = self.textCursor()
|
||||||
# c_format = cursor.charFormat()
|
# c_format = cursor.charFormat()
|
||||||
@@ -5181,6 +5228,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
hi_selection = QTextEdit.ExtraSelection()
|
hi_selection = QTextEdit.ExtraSelection()
|
||||||
|
|
||||||
hi_selection.format.setBackground(self.palette().alternateBase())
|
hi_selection.format.setBackground(self.palette().alternateBase())
|
||||||
|
if self.theme not in ['default', 'light']:
|
||||||
|
hi_selection.format.setForeground(QtGui.QColor('black'))
|
||||||
hi_selection.format.setProperty(QtGui.QTextFormat.Property.FullWidthSelection, True)
|
hi_selection.format.setProperty(QtGui.QTextFormat.Property.FullWidthSelection, True)
|
||||||
hi_selection.cursor = self.textCursor()
|
hi_selection.cursor = self.textCursor()
|
||||||
hi_selection.cursor.clearSelection()
|
hi_selection.cursor.clearSelection()
|
||||||
@@ -5231,12 +5280,15 @@ class FCTextAreaLineNumber(QtWidgets.QFrame):
|
|||||||
|
|
||||||
painter.end()
|
painter.end()
|
||||||
|
|
||||||
def __init__(self, *args, color_dict=None):
|
def __init__(self, *args, color_dict=None, **kwargs):
|
||||||
|
self.theme = kwargs.pop('theme')
|
||||||
|
if self.theme is None:
|
||||||
|
self.theme = 'default'
|
||||||
QtWidgets.QFrame.__init__(self, *args)
|
QtWidgets.QFrame.__init__(self, *args)
|
||||||
|
|
||||||
self.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Sunken)
|
self.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Sunken)
|
||||||
|
|
||||||
self.edit = self.PlainTextEdit(color_dict=color_dict)
|
self.edit = self.PlainTextEdit(color_dict=color_dict, theme=self.theme)
|
||||||
self.number_bar = self.NumberBar(self.edit)
|
self.number_bar = self.NumberBar(self.edit)
|
||||||
|
|
||||||
hbox = QtWidgets.QHBoxLayout(self)
|
hbox = QtWidgets.QHBoxLayout(self)
|
||||||
|
|||||||
Reference in New Issue
Block a user