#python #qt #qstatusbar
#python #qt #qstatusbar
Вопрос:
Я использую Qt с Python, и у меня есть главное окно со строкой состояния внизу. Я могу отобразить сообщение в строке, используя QLabel, и задать цвет этого сообщения, используя что-то вроде "<font color="green">In progress</font>"
для текста QLabel.
Я хотел бы также поместить временное сообщение в строку состояния и назначить цвет этому сообщению. Однако, поскольку на этот раз это не QLabel (я использую QStatusBar::ShowMessage, который просто принимает QString) Я больше не могу изменить цвет. Приведенные выше теги не распознаются, и вся строка "<font color="green">In progress</font>"
отображается серым цветом.
У кого-нибудь есть какие-нибудь идеи?
Ответ №1:
Чтобы задать цвет фона или текста для QStatusBar, измените его таблицу стилей перед отображением сообщения:
self.status.setStyleSheet("QStatusBar{padding-left:8px;background:rgba(255,0,0,255);color:black;font-weight:bold;}")
self.status.showMessage("Error Cannot determine filepath", msecs= 5000)
при инициализации подключите messageChanged(QString) панели QStatusBar к функции StatusChanged().
def statusChanged(self, args):
'''If there are no arguments (the message is being removed)
change the background back to transparent/ text back to black'''
if not args:
self.status.setStyleSheet("QStatusBar{padding-left:8px;background:rgba(0,0,0,0);color:black;font-weight:bold;}")
T
Ответ №2:
К сожалению, QStatusBar::showMessage()
не поддерживает форматирование расширенного текста. Об этом даже сообщалось как о запросе функции давным-давно, но, похоже, этому не уделялось достаточного внимания.
Я думаю, вам лучше всего либо придерживаться обычных текстовых сообщений, либо напрямую манипулировать вашими существующими QLabel
. Это потребовало бы некоторой дополнительной работы для обработки временных изменений статуса, поэтому вам решать, стоит ли это того.
Комментарии:
1. Спасибо, Кароль, полезно знать, что это просто невозможно напрямую с Qt. На случай, если это поможет кому-то еще, я придумал другое решение. Я добавил QLabel в строку состояния с помощью addWidget, затем создал таймер, который периодически очищал бы эту метку. Все, что мне нужно было сделать после этого, это убедиться, что таймер сбрасывался каждый раз, когда QLabel обновлялся новым текстом.
2. Приятно слышать, что вы нашли способ. Так устроен Qt , то тут, то там есть некоторые ограничения, но в большинстве случаев вы можете найти обходной путь. По крайней мере, таково было мое впечатление от версии 4.3.
Ответ №3:
Если весь текст showMessages будет одинакового цвета, вы можете определить его в палитре QStatusBar с помощью QtDesigner (цвет текста окна) для временных сообщений, а затем использовать цвет QLabel для обычных и постоянных сообщений разных цветов.
Комментарии:
1. Это потрясающе! В Qt Designer щелкните где-нибудь в окне так, чтобы это был текущий объект, перейдите к палитре примерно на 1/3 вниз в редакторе свойств, и «текст окна» будет прямо вверху. Также повлияет на подвиджеты, такие как названия вкладок в виджете tab, который вы добавили в окно в Qt Designer. Но, похоже, это не влияет на каждый виджет, который вы добавляете программно, что хорошо. Если это так, и это нежелательно, то переопределите цвет с помощью таблицы стилей подвиджета.
Ответ №4:
Самое короткое решение, которое я смог найти для этой проблемы на данный момент:
ui->statusBar->setStyleSheet("color: red");
ui->statusBar->showMessage("Your error message", 2000);
QTimer::singleShot(2000, [this]{ ui->statusBar->setStyleSheet("color: black"); });
Однако это не на 100% чисто — если другое сообщение такого рода запускается в течение 2 секунд времени выполнения таймера, то цвет, возможно, изменится слишком рано. Но на практике это вряд ли будет иметь какое-либо значение.
Ответ №5:
Вы также можете создать подкласс QStatusBar
и реализовать «цветные» сообщения о состоянии, что-то вроде (в C ):
class QStatusBarX : public QStatusBar
{
public:
QStatusBarX::QStatusBarX(QWidget * parent = 0)
{
}
QStatusBarX::~QStatusBarX(void)
{
}
void showMessageGreen(const QString amp; message)
{
this->setStyleSheet("color: green");
this->showMessage(message);
}
};
Ответ №6:
в Python используется
self.statusBar().setStyleSheet("color : pink")