Возможно ли получить черную рамку на белом тексте? - PullRequest
0 голосов
/ 11 сентября 2018

Итак, у меня есть своего рода графический инструмент, использующий графический интерфейс PyQt5 и позволяющий пользователю окрашивать узлы и называть их.Но вы можете представить, что в зависимости от того, какого цвета вы окрашиваете узлы, текст может быть неразборчивым.Так что, если бы был способ получить черную рамку на QFont, тогда я мог бы сделать текст белым, и он хорошо бы отображался над чем угодно.Возможно ли это, учитывая рамки?

Я также открыт для любого решения, которое решает проблему возможности читать текст любого цвета.Спасибо.

Редактировать:

from PyQt5 import QtGui, QtWidgets


class MyPushButton(QtWidgets.QPushButton):

    def __init__(self, text):
        super(MyPushButton, self).__init__()
        self.setFixedHeight(50)

        self.font = QtGui.QFont()
        self.setupFont()
        self.setFont(self.font)

        self.setStyleSheet('color: white; background-color: yellow')
        self.setText(text)
        self.clicked.connect(self.change_color)

    def change_color(self):
        color = QtWidgets.QColorDialog.getColor()
        if color.isValid():
            self.setStyleSheet('color: white;background-color:' + color.name())

    def setupFont(self):
        self.font.setFamily('Palatino')
        self.font.setPointSize(20)
        # some other font manipulations


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    widget = QtWidgets.QWidget()
    layout = QtWidgets.QVBoxLayout()

    push1 = MyPushButton('test text 1')
    layout.addWidget(push1)

    push2 = MyPushButton('test text 2')
    layout.addWidget(push2)

    widget.setLayout(layout)
    widget.show()
    sys.exit(app.exec_())

Я хочу:

enter image description here

1 Ответ

0 голосов
/ 11 сентября 2018

Одним из возможных решений является использование QML для создания этого эффекта, а для использования его с классическими виджетами вы должны использовать QQuickWidget, как показано ниже:

main.qml

import QtQuick 2.9
import QtQuick.Controls 2.4

Button {
    id: control
    property color color: "white"
    property color _color:  down ? Qt.lighter(color, 1.1):  color
    property color light_color: Qt.lighter(control._color, 1.1)
    property color dark_color: Qt.darker(control._color, 1.1)
    contentItem: Text {
        text: control.text
        font: control.font
        color: "white"
        style: Text.Outline
        styleColor: "black"
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }

    background: Rectangle {
        opacity: enabled ? 1 : 0.3
        border.width: 0.7
        border.color: "gray"
        radius: 2
        gradient: Gradient {
            GradientStop { position: 0 ; color: control.pressed ? control._color : control.light_color }
            GradientStop { position: 1 ; color: control.pressed ? control.dark_color : control._color }
        }
    }
    onClicked: obj.clicked()
}

main.py

from PyQt5 import QtCore, QtGui, QtWidgets, QtQuickWidgets

class ButtonQMl(QtQuickWidgets.QQuickWidget):
    clicked = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(ButtonQMl, self).__init__(parent)
        self.setSource(QtCore.QUrl.fromLocalFile("main.qml"))
        self.setResizeMode(QtQuickWidgets.QQuickWidget.SizeRootObjectToView)
        self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        self.engine().rootContext().setContextProperty("obj", self)
        self.setFixedHeight(50)

    def text(self):
        return self.rootObject().property("text") if self.rootObject() else  ""

    def setText(self, text):
        if self.rootObject() and self.text() != text:
            self.rootObject().setProperty("text", text)

    def color(self):
        return self.rootObject().property("color") if self.rootObject() else  ""

    def setColor(self, color):
        color = QtGui.QColor(color)
        if self.rootObject() and self.color() != color:
            self.rootObject().setProperty("color", color)

    def font(self):
        return self.rootObject().property("font") if self.rootObject() else  ""

    def setFont(self, font):
        if self.rootObject() and self.font() != font:
            self.rootObject().setProperty("font", font)


class MyButton(ButtonQMl):
    def __init__(self, parent=None):
        super(MyButton, self).__init__(parent)
        self.clicked.connect(self.change_color)
        self.setupFont()

    def change_color(self):
        color = QtWidgets.QColorDialog.getColor()
        if color.isValid():
            self.setColor(color)

    def setupFont(self):
        fnt = self.font()
        fnt.setFamily('Palatino')
        fnt.setPointSize(20)
        self.setFont(fnt)

    def mousePressEvent(self, event):
        print("event: ", event)
        super(MyButton, self).mousePressEvent(event)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    btn1 = MyButton()
    btn1.setText("Hello World");
    btn1.setColor(QtCore.Qt.yellow)

    btn2 = QtWidgets.QPushButton("Click me")
    btn2.setFixedHeight(50)
    btn2.setStyleSheet("color: white; background-color: yellow")

    lay.addWidget(btn1)
    lay.addWidget(btn2)

    w.show()
    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...