QListView可以检测到特定的QString并因此自动触发插槽吗?

问题描述 投票:0回答:1

我在QLineEdit上有特定的字符串,该字符串通过QListView传递到QPushButton。这些字符串是QComboBox的选择,它们非常具体:

1)“ [信息]最小距离:5”,

2)“ [信息]最小距离:10”和

3)“ [信息]最小距离:15”

[Here,如果需要测试,是一个可以正常工作的最小可验证示例。

当前,我可以successfully更改QGraphicsView的颜色,但是通过单击或双击在QString中输入的QListView

问题:如何更改QString中特定的QListView内容以更改QGraphicsView的背景颜色?我的意思是我不想单击或双击QListView的条目,但是我希望QListView看到有一个字符串“ [INFO] Minimum Distance:5”,因此更改了自动更改QGraphicsView的颜色,而无需单击或双击QListView条目。在我“转到插槽”之后,我的选择如下:

“

在MVE工作代码下面,您可以在计算机上复制/粘贴,它将起作用:

mainwindow.h

#include <QMainWindow> #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(); void updateListView(); void updateListView(const QString & message); private slots: void on_pushButton_clicked(); void on_listView_entered(const QModelIndex &index); void on_listView_activated(const QModelIndex &index); private: Ui::MainWindow *ui; QGraphicsView *mView; QGraphicsScene *mScene; QGraphicsTextItem *mText; StringList *newString; QStringListModel *model; }; #endif // MAINWINDOW_H

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); QFont font; font.setPixelSize(10); font.setBold(false); font.setFamily("Calibri"); 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); emptyIndex(); connect(ui->listView, SIGNAL(loggingUpdated()), this, SLOT(updateListView(const QString &))); connect(ui->graphicsView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(on_listView_activated(const QModelIndex &index))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateListView(const QString & message) { if(model->insertRow(model->rowCount())) { QModelIndex index = model->index(model->rowCount() - 1, 0); model->setData(index, message); ui->listView->scrollTo(index); } } 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); ui->listView->scrollToBottom(); } void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1) { QString list = ui->comboBox->currentText(); ui->lineEdit->setText(list); Q_UNUSED(arg1) } void MainWindow::on_listView_activated(const QModelIndex &index) { QStringList allStrings = model->stringList(); QString last = allStrings.last(); if(last.startsWith("[ INFO] Minimum Distance: 5")) { ui->graphicsView->setBackgroundBrush(QColor(Qt::red)); } else if(last.startsWith("[ INFO] Minimum Distance: 10")) { ui->graphicsView->setBackgroundBrush(QColor(Qt::yellow)); } else if(last.startsWith("[ INFO] Minimum Distance: 15")) { ui->graphicsView->setBackgroundBrush(QColor(Qt::green)); } Q_UNUSED(index) }

编辑2

mainwindow.h

#include <QMainWindow> #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsTextItem> #include <QStringListModel> #include "listview.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); public slots: void setGraphicViewColor(QColor c); private: Ui::MainWindow *ui; QGraphicsView *mView; QGraphicsScene *mScene; QGraphicsTextItem *mText; QStringListModel *model; ListView *myListView; }; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); mView = new QGraphicsView(); mScene = new QGraphicsScene(); ui->graphicsView->setScene(mScene); QFont font; font.setPixelSize(10); font.setBold(false); font.setFamily("Calibri"); 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); connect(ui->listView, SIGNAL(changeColor(QColor)), this, SLOT(setGraphicViewColor(QColor))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::setGraphicViewColor(QColor c) { qDebug() << "Update your graphicsView backgroundBrush" << c; ui->graphicsView->setBackgroundBrush(Qt::green); }

listview.h

#ifndef LISTVIEW_H #define LISTVIEW_H #include <QListView> #include <QStringListModel> class ListView : public QListView { Q_OBJECT public: ListView(QWidget *parent = nullptr); signals: void changeColor(QColor c); protected: void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override; }; #endif // LISTVIEW_H

listview.cpp

#include "listview.h" ListView::ListView(QWidget *parent) : QListView(parent) {} void ListView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) { QListView::dataChanged(topLeft, bottomRight, roles); /** * Assuming that you have just one item changed * So topLeft == bottomRight */ if (topLeft.row() == model()->rowCount()-1){ QString last = topLeft.data().toString(); if(last.startsWith("[ INFO] Minimum Distance: 5")) { emit changeColor(Qt::red); } else if(last.startsWith("[ INFO] Minimum Distance: 10")) { emit changeColor(Qt::yellow); } else if(last.startsWith("[ INFO] Minimum Distance: 15")) { emit changeColor(Qt::green); } } }
“

到目前为止我所做的:

我在这个问题上进行了很多研究,发现this source很有用,但不能解决问题,但除此之外,似乎使用了QModelIndex,我不确定这正是我所要解决的问题。需要这个小项目。

我也阅读了this source,它对于建立和捕获特定且唯一的字符串很有用,但是就改变颜色而言,我无法解决。

非常感谢您为解决此问题指明了正确的方向。

我在QLineEdit上有一个特定的字符串,该字符串通过QPushButton传递给QListView。这些字符串是QComboBox的选择,它们非常具体:1)“ [INFO]最小距离:5”,...

qt c++11 qt5 qlistview
1个回答
0
投票
如果我很了解,如果backgroundBrush的最后一项以您的特定字符串开头,则您想更改graphicsViewQStringListModel
© www.soinside.com 2019 - 2024. All rights reserved.