如何根据 QListView 中的特定 QString 内容更改 QGraphicsView 背景颜色
How to change QGraphicsView background color based on specific QString content inside a QListView
为了缩小问题我做了一个小gui的可验证的小例子。
如果您想看一下代码,可以查看 here.
我在 QLineEdit
上有一个特定的字符串,这个字符串通过 QPushButton
传递给 QListView
,如下所示。
这些字符串是 QComboBox
的选择,它们非常具体:1) "[INFO] 最小距离:5",2) "[INFO] 最小距离:10" 和 3) "[INFO] 最小距离: 15
问题: 如何检测 QListView
中的特定 QString
内容,以便更改 QGraphicsView
的背景颜色]?
例如如果QListView
里面有“[INFO]最小距离:5”,QGraphicsView
的颜色应该是红色或者如果 QListView
内有“[INFO] 最小距离:10”,QGraphicsView
的颜色应该是黄色等
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mView = new QGraphicsView();
mScene = new QGraphicsScene();
ui->graphicsView->setScene(mScene);
mText = new QGraphicsTextItem;
mText->setPos(150,70);
mScene->addText(tr("Boat outside alarm area"))->setDefaultTextColor(Qt::black);
model = new QStringListModel();
ui->listView->setModel(model);
ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
changeColorDetection();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeColorDetection()
{
QColor red;
QColor yellow;
QColor green;
// if [ INFO] Minimum Distance: 5 inside QListView
// Than change color of the QGraphicsView background to red
// if [ INFO] Minimum Distance: 10 inside QListView
// Than change color of the QGraphicsView background to yellow
QModelIndex index = ui->listView->currentIndex();
QString itemText = index.data(Qt::DisplayRole).toString();
if(itemText.startsWith("[ INFO] Minimum Distance: 10"))
{
ui->graphicsView->setStyleSheet("QGraphicsView {background-color: red}");
}
}
void MainWindow::on_pushButton_clicked()
{
QString str = ui->lineEdit->text();
model->insertRow(model->rowCount());
QModelIndex index = model->index(model->rowCount()-1);
model->setData(index, str);
}
void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
{
QString list = ui->comboBox->currentText();
ui->lineEdit->setText(list);
Q_UNUSED(arg1)
}
mainwindow.h
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>
#include <QStringListModel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void changeColorDetection();
private slots:
void on_pushButton_clicked();
void on_comboBox_currentIndexChanged(const QString &arg1);
private:
Ui::MainWindow *ui;
QGraphicsView *mView;
QGraphicsScene *mScene;
QGraphicsTextItem *mText;
QStringListModel *model;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
如果您还想看小 .ui
,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>382</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Area</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="checkBoxRedArea">
<property name="text">
<string>Red area</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxYellowArea">
<property name="text">
<string>Yellow Area</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxGreenArea">
<property name="text">
<string>Green Area</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Add Message</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item>
<widget class="QComboBox" name="comboBox">
<item>
<property name="text">
<string>Select Option Distance</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 5</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 10</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 15</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 20</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListView" name="listView"/>
</item>
<item>
<widget class="QGraphicsView" name="graphicsView">
<property name="styleSheet">
<string notr="true">background-color: rgb(211, 215, 207);</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
到目前为止我做了什么:
我已经对这个问题做了很多研究,遇到了 this source 这很有用但无法解决问题,但另外它似乎使用了 QModelIndex
我是不确定这正是我这个小项目所需要的。
我还阅读了 this source,这对于建立和捕获特定且唯一的字符串很有用,但就更改颜色而言,我无法解决这个问题。
我也遇到了 这让我尝试了以下内容:
void MainWindow::changeColorDetection()
{
// if [ INFO] Minimum Distance: 5 inside QListView
// Than change color of the QGraphicsView background
QModelIndex index = ui->listView->currentIndex();
QString itemText = index.data(Qt::DisplayRole).toString();
if(itemText.startsWith("[ INFO] Minimum Distance: 10"))
{
QColor bg = ui->graphicsView->palette().background().color();
ui->graphicsView->setStyleSheet(QString("background-color:") + bg.name(QColor::HexArgb));
}
}
但最后一个也没有导致背景发生任何变化。
我错过了什么?非常感谢您为解决这个问题指明了正确的方向。
QGraphicsView 背景处理不同于您可能使用样式表定义背景的其他小部件。使用 ui->graphicsView->setBackgroundBrush()
更改简单的背景,或重载 QGraphicsView::setBackground()
来更改任何更复杂的内容。你的情况:
ui->graphicsView->setBackgroundBrush(QColor("red"))
请参阅 SVG color names 了解有效的颜色名称或使用十六进制表示法。
关于导致颜色变化的文本的检测,需要注意的是列表模型有多个独立的条目,需要建立颜色变化的规则。在您的示例中,它会根据当前选定的项目进行更改。或者您想根据最新项目或任何项目更改它?在这些情况下,您可能需要在添加和删除项目时观察信号,and/or 以搜索所有项目。直接使用您的模型非常容易:
QStringList allStrings = model()->stringList();
QString last = allStrings.last();
// also have a look at QStringList::contains(), QStringList::lastOf()
为了缩小问题我做了一个小gui的可验证的小例子。 如果您想看一下代码,可以查看 here.
我在 QLineEdit
上有一个特定的字符串,这个字符串通过 QPushButton
传递给 QListView
,如下所示。
这些字符串是 QComboBox
的选择,它们非常具体:1) "[INFO] 最小距离:5",2) "[INFO] 最小距离:10" 和 3) "[INFO] 最小距离: 15
问题: 如何检测 QListView
中的特定 QString
内容,以便更改 QGraphicsView
的背景颜色]?
例如如果QListView
里面有“[INFO]最小距离:5”,QGraphicsView
的颜色应该是红色或者如果 QListView
内有“[INFO] 最小距离:10”,QGraphicsView
的颜色应该是黄色等
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mView = new QGraphicsView();
mScene = new QGraphicsScene();
ui->graphicsView->setScene(mScene);
mText = new QGraphicsTextItem;
mText->setPos(150,70);
mScene->addText(tr("Boat outside alarm area"))->setDefaultTextColor(Qt::black);
model = new QStringListModel();
ui->listView->setModel(model);
ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
changeColorDetection();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeColorDetection()
{
QColor red;
QColor yellow;
QColor green;
// if [ INFO] Minimum Distance: 5 inside QListView
// Than change color of the QGraphicsView background to red
// if [ INFO] Minimum Distance: 10 inside QListView
// Than change color of the QGraphicsView background to yellow
QModelIndex index = ui->listView->currentIndex();
QString itemText = index.data(Qt::DisplayRole).toString();
if(itemText.startsWith("[ INFO] Minimum Distance: 10"))
{
ui->graphicsView->setStyleSheet("QGraphicsView {background-color: red}");
}
}
void MainWindow::on_pushButton_clicked()
{
QString str = ui->lineEdit->text();
model->insertRow(model->rowCount());
QModelIndex index = model->index(model->rowCount()-1);
model->setData(index, str);
}
void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
{
QString list = ui->comboBox->currentText();
ui->lineEdit->setText(list);
Q_UNUSED(arg1)
}
mainwindow.h
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>
#include <QStringListModel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void changeColorDetection();
private slots:
void on_pushButton_clicked();
void on_comboBox_currentIndexChanged(const QString &arg1);
private:
Ui::MainWindow *ui;
QGraphicsView *mView;
QGraphicsScene *mScene;
QGraphicsTextItem *mText;
QStringListModel *model;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
如果您还想看小 .ui
,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>382</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Area</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="checkBoxRedArea">
<property name="text">
<string>Red area</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxYellowArea">
<property name="text">
<string>Yellow Area</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxGreenArea">
<property name="text">
<string>Green Area</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Add Message</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item>
<widget class="QComboBox" name="comboBox">
<item>
<property name="text">
<string>Select Option Distance</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 5</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 10</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 15</string>
</property>
</item>
<item>
<property name="text">
<string>[ INFO] Minimum Distance: 20</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListView" name="listView"/>
</item>
<item>
<widget class="QGraphicsView" name="graphicsView">
<property name="styleSheet">
<string notr="true">background-color: rgb(211, 215, 207);</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
到目前为止我做了什么:
我已经对这个问题做了很多研究,遇到了 this source 这很有用但无法解决问题,但另外它似乎使用了 QModelIndex
我是不确定这正是我这个小项目所需要的。
我还阅读了 this source,这对于建立和捕获特定且唯一的字符串很有用,但就更改颜色而言,我无法解决这个问题。
我也遇到了
void MainWindow::changeColorDetection()
{
// if [ INFO] Minimum Distance: 5 inside QListView
// Than change color of the QGraphicsView background
QModelIndex index = ui->listView->currentIndex();
QString itemText = index.data(Qt::DisplayRole).toString();
if(itemText.startsWith("[ INFO] Minimum Distance: 10"))
{
QColor bg = ui->graphicsView->palette().background().color();
ui->graphicsView->setStyleSheet(QString("background-color:") + bg.name(QColor::HexArgb));
}
}
但最后一个也没有导致背景发生任何变化。
我错过了什么?非常感谢您为解决这个问题指明了正确的方向。
QGraphicsView 背景处理不同于您可能使用样式表定义背景的其他小部件。使用 ui->graphicsView->setBackgroundBrush()
更改简单的背景,或重载 QGraphicsView::setBackground()
来更改任何更复杂的内容。你的情况:
ui->graphicsView->setBackgroundBrush(QColor("red"))
请参阅 SVG color names 了解有效的颜色名称或使用十六进制表示法。
关于导致颜色变化的文本的检测,需要注意的是列表模型有多个独立的条目,需要建立颜色变化的规则。在您的示例中,它会根据当前选定的项目进行更改。或者您想根据最新项目或任何项目更改它?在这些情况下,您可能需要在添加和删除项目时观察信号,and/or 以搜索所有项目。直接使用您的模型非常容易:
QStringList allStrings = model()->stringList();
QString last = allStrings.last();
// also have a look at QStringList::contains(), QStringList::lastOf()