Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175

Как найти макс. и мин. элемент в таблице, QT?

15.02.2023, 11:53. Показов 4398. Ответов 46

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане! Вопрос может показаться простым, однако я новичок в QT, не совсем ещё шарю даже за самые простые понятия

Я сделал таблицу 7х7, заполнил её случайными значениями в пределах до 100, но надо ещё как-то определить макс. и мин. элементы, и ещё и подкрасить их соответствующими цветами (неважно какими, можно красным - минимальное, зелёным - макс.)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2023, 11:53
Ответы с готовыми решениями:

Найти мин элемент каждой строки и макс элемент столбцов, строку с макс суммой, строку с макс элем.
Массив 10х10 N=10 1) Минимальный элемент каждой строки 2) Максимальный элемент каждого столбца 3) В какой строке максимальная...

Найти макс и мин значения для short, int, unsigned long, double и подать это что бы выводилась таблица с мин и макс знач
найти макс и мин значения для short, int, unsigned long, double и подать это что бы выводилась таблица с мин и макс значения на языку с

Найти в массиве мин. элемент T и макс. элемент M. Получить в порядке возрастания все целые числа из интервала (T;M)
Дан массив целых чисел.Найти в этом массиве минимальный элемент T и максимальный элемент M.Получить в порядке возрастния все целые числа из...

46
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
15.02.2023, 18:27  [ТС]
Студворк — интернет-сервис помощи студентам
У меня такая штука получилась с генерацией значений. При нажатии на кнопку они действительно генерируются, и каждый раз - новые значения
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
15.02.2023, 18:31
Цитата Сообщение от Nepravilon Посмотреть сообщение
Просто вы пишете немного по-другому, у вас другой стиль, поэтому я не могу его понять
Стиля особого нет... Сложно воспринимается наверное потому, что все слеплено в .h файл...
Можно добавить файл .cpp с таким же названием, как .h
Затем переходите в .h файл, находите реализацию метода, например
class myClass{
...
void foo(){... реализация...}
}
Наводите курсор на foo, правый клик, "рефактор-переместить реализацию в .cpp"
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
15.02.2023, 18:39  [ТС]
Затем переходите в .h файл, находите реализацию метода, например
Нее, я уверен, можно сделать гораздо проще, не заморачиваясь ни с хедерами, ни с методами

Добавлено через 4 минуты
Стиля особого нет... Сложно
И всё же вы пишете по-другому))
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
15.02.2023, 18:43
Цитата Сообщение от Nepravilon Посмотреть сообщение
И всё же вы пишете по-другому))
ну хз, -может быть

Цитата Сообщение от Nepravilon Посмотреть сообщение
При нажатии на эти кнопки, например на "Макс.значение", в таблице должна окраситься ячейка с макс. элементом в зелёный))
Вам надо обработать нажатие на кнопку, в котором окрасить ячейку.

Hапример есть таблица table, кнопка btn, и были найдены индексы ячеек таблицы с максимальным значением rowMax, colMax
Предполагается, что table, btn, rowMax, colMax - это поля класса.
Пишете коннект:
-можно так:
C++ (Qt)
1
2
3
connect(btn, &QAbstractButton::clicked, this, [this]{
        table->item(rowMax, colMax)->setBackground(Qt::green);
});
-можно создать отдельный слот (смотрите сигналы/слоты в Qt)
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
15.02.2023, 18:50  [ТС]
C++ (Qt)
1
2
connect(btn, &QAbstractButton::clicked, this, [this]{
        table->item(rowMax, colMax)->setBackground(Qt::green);
});
Хм, можно попробовать, я ещё никогда не работал с коннектами


-можно создать отдельный слот (смотрите сигналы/слоты в Qt)
А это уже что-то похожее на правду
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
15.02.2023, 18:59
Цитата Сообщение от Nepravilon Посмотреть сообщение
Хм, можно попробовать, я ещё никогда не работал с коннектами
Попробуйте где-нить в конструкторе MainWindow написать такой код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        
        auto table=new QTableWidget; 
        auto btn=new QPushButton("btn");
 
        auto form=new QWidget;
        setCentralWidget(form);
        auto layout=new QVBoxLayout;
        form->setLayout(layout);
 
        layout->addWidget(table);
        layout->addWidget(btn);
 
        table->setRowCount(3);
        table->setColumnCount(3);
 
        for(int r=0; r<3; r++)
            for(int c=0; c<3; c++)
                table->setItem(r,c, new QTableWidgetItem);
 
       connect(btn, &QAbstractButton::clicked, this, [table]{
             table->item(1, 1)->setBackground(Qt::green);
       });
Ну и далее уже поймете как крутить этими коннектами, разными способами.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
15.02.2023, 19:10  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Попробуйте где-нить в конструкторе MainWindow написать такой код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        
        auto table=new QTableWidget; 
        auto btn=new QPushButton("btn");
 
        auto form=new QWidget;
        setCentralWidget(form);
        auto layout=new QVBoxLayout;
        form->setLayout(layout);
 
        layout->addWidget(table);
        layout->addWidget(btn);
 
        table->setRowCount(3);
        table->setColumnCount(3);
 
        for(int r=0; r<3; r++)
            for(int c=0; c<3; c++)
                table->setItem(r,c, new QTableWidgetItem);
 
       connect(btn, &QAbstractButton::clicked, this, [table]{
             table->item(1, 1)->setBackground(Qt::green);
       });
Ну и далее уже поймете как крутить этими коннектами, разными способами.
Нет, коннекты, всё-таки, это тоже замудренный способ.

Может если я покажу участок кода, где нужно что-то дописать, будет понятнее всем:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Dialog::on_maxButton_clicked()
{
    int MaxRow, MaxCol;
 
    QColor colorMax = Qt::green;
    QModelIndex maxItemIndex = model->index(0, 0); int maxItemValue = model->data(maxItemIndex).toInt();
    for(int row = 0; row < model->rowCount(); ++row)
    {
        for(int col = 0; col < model->columnCount(); ++col)
        {
            QModelIndex index = model->index(row,col);
            int value = model->data(index).toInt();    
            if (value > maxItemValue)                 
            {
                maxItemValue = value;
                maxItemIndex = index;
            }
        }
    }
}
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
15.02.2023, 19:30
Цитата Сообщение от Nepravilon Посмотреть сообщение
Нет, коннекты, всё-таки, это тоже замудренный способ.
Вы удивитесь, но коннект Вами уже использовался, только неявно, в дизайнере.
on_maxButton_clicked() - зто слот, привязанный коннектом к сигналу clicked кнопки, как-то так
C++ (Qt)
1
connect(maxButton, &QAbstractButton::clicked, this, &MainWindow::on_maxButton_clicked);
По окраске ячейки, чет вроде

C++ (Qt)
1
model->itemFromIndex(maxItemIndex)->setBackground(colorMax);
после циклов, тоесть после скобки в 19-й строчке

Добавлено через 2 минуты
ЗЫ если хотите работать в Qt-коннекты надо знать обязательно
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
15.02.2023, 22:09  [ТС]
C++ (Qt)
1
on_maxButton_clicked() - зто слот, привязанный коннектом к сигналу clicked кнопки, как-то так
Ааа, ну такие коннекты мне нравятся))))

C++ (Qt)
1
model->itemFromIndex(maxItemIndex)->setBackground(colorMax);
Спасибо большое! Очень надеюсь, что поможет!!

Добавлено через 2 минуты
Хм... не сработало (( Может быть я что-то не так написал?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Dialog::on_maxButton_clicked()
{
    QColor colorMax = Qt::green;
    QModelIndex maxItemIndex = model->index(0, 0); int maxItemValue = model->data(maxItemIndex).toInt();
    for(int row = 0; row < model->rowCount(); ++row)
    {
        for(int col = 0; col < model->columnCount(); ++col)
        {
            QModelIndex index = model->index(row,col);  // индекс
            int value = model->data(index).toInt();     // передаём значение по индексу
            if (value > maxItemValue)                   // если оно больше максимального
            {
                maxItemValue = value;                   // значит максимальное надо приравнять к нему
                maxItemIndex = index;
            }
        }
    }
    model->itemFromIndex(maxItemIndex)->setBackground(colorMax);
 
}
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 00:24
Nepravilon, та вроде правильно...
Посмотрите, получается ли правильный индекс?
C++ (Qt)
1
qDebug()<<maxItemIndex->row()<<maxItemIndex->column();
вот такой тестовый код в main.cpp работает норм:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    auto table=new QTableView;
    table->show();
 
    auto model=new QStandardItemModel;
    model->setRowCount(3);
    model->setColumnCount(3);
 
    for(int r=0; r<model->rowCount(); r++)
        for(int c=0; c<model->columnCount(); c++)
            model->setItem(r, c, new QStandardItem(QString::number(rand()%100)));
 
    table->setModel(model);
 
    QModelIndex idxMax, idxMin=model->index(0,0);
 
    for(int r=0; r<model->rowCount(); r++){
        for(int c=0; c<model->columnCount(); c++){
 
            auto currentIdx=model->index(r, c);
 
            if(currentIdx.data().toInt() > idxMax.data().toInt())
                idxMax=currentIdx;
            if(currentIdx.data().toInt() < idxMin.data().toInt())
                idxMin=currentIdx;
        }
    }
 
    if(idxMax.isValid())
        model->itemFromIndex(idxMax)->setBackground(Qt::green);
    if(idxMin.isValid())
        model->itemFromIndex(idxMin)->setBackground(Qt::red);
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
16.02.2023, 00:40  [ТС]
C++ (Qt)
1
qDebug()<<maxItemIndex->row()<<maxItemIndex->column();
хз, этот код у меня не компилируется. Пишет: ошибка: member reference type 'QModelIndex' is not a pointer; did you mean to use '.'?

А код если запихнуть в main.cpp, у меня 2 окна выскакивает: ваше, и моё. В вашем всё работает, к слову, только я с кнопочками хотел забабахать
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 00:47
Цитата Сообщение от Nepravilon Посмотреть сообщение
did you mean to use '.'
надо заменить стрелки на точки, мой косяк )
C++ (Qt)
1
qDebug()<<maxItemIndex.row()<<maxItemIndex.column();

Цитата Сообщение от Nepravilon Посмотреть сообщение
А код если запихнуть в main.cpp, у меня 2 окна выскакивает: ваше, и моё. В вашем всё работает, к слову, только я с кнопочками хотел забабахать
тот код всего лиш тест, ну щас кнопки допишу ок)

Обратите внимание
Там в тему про матрицу 5х5 Вам выложили классный вариант таблицы, в котором выделяется (стандартным выделением) минимум и максимум, через селекшн модель, по нажатию кнопок.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
16.02.2023, 01:03  [ТС]
надо заменить стрелки на точки, мой косяк )
Да, но только код от этого работать лучше не стал ((

через селекшн модель, по нажатию кнопок.
О, а вот это уже интересно ))) Спасибо большое, что напомнили))
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 01:22
Дописал кнопки в тестовый пример, который выше.
Добавите новый заголовочник, в него этот код,
и в main.cpp
form f; f.show();


Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
 
class form:public QWidget
{
    Q_OBJECT
 
public:
    explicit form(QWidget *parent=nullptr):QWidget(parent){
 
        auto layout = new QVBoxLayout;
        setLayout(layout);
 
        auto table=new QTableView;
        layout->addWidget(table);
 
        auto model=new QStandardItemModel;
        model->setRowCount(5);
        model->setColumnCount(5);
 
        for(int r=0; r<model->rowCount(); r++)
            for(int c=0; c<model->columnCount(); c++)
                model->setItem(r,c, new QStandardItem(QString::number(rand()%100)));
 
        table->setModel(model);
        table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
 
        QModelIndex idxMax, idxMin=model->index(0,0);
 
        for(int r=0; r<model->rowCount(); r++){
            for(int c=0; c<model->columnCount(); c++){
 
                auto currentIdx=model->index(r,c);
 
                if(currentIdx.data().toInt() > idxMax.data().toInt())
                    idxMax=currentIdx;
                if(currentIdx.data().toInt() < idxMin.data().toInt())
                    idxMin=currentIdx;
            }
        }
 
 
        auto hLayout=new QHBoxLayout;
        auto btnMax=new QPushButton("max");
        auto btnMin=new QPushButton("min");
 
        hLayout->addStretch();
        hLayout->addWidget(btnMax);
        hLayout->addWidget(btnMin);
 
        layout->addLayout(hLayout);
        layout->addStretch();
 
        connect(btnMax, &QAbstractButton::clicked, this, [idxMax, model]{
 
            if(idxMax.isValid())
                model->itemFromIndex(idxMax)->setBackground(Qt::green);
        });
 
        connect(btnMin, &QAbstractButton::clicked, this, [idxMin, model]{
 
            if(idxMin.isValid())
                model->itemFromIndex(idxMin)->setBackground(Qt::red);
        });
 
    }
 
    virtual ~form(){}
 
};


Добавлено через 3 минуты
Цитата Сообщение от Nepravilon Посмотреть сообщение
Да, но только код от этого работать лучше не стал ((
хм, не выводится в консоль? должно бы... я хз
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
16.02.2023, 02:18  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Дописал кнопки в тестовый пример, который выше.
Добавите новый заголовочник, в него этот код,
и в main.cpp
form f; f.show();


Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
 
class form:public QWidget
{
    Q_OBJECT
 
public:
    explicit form(QWidget *parent=nullptr):QWidget(parent){
 
        auto layout = new QVBoxLayout;
        setLayout(layout);
 
        auto table=new QTableView;
        layout->addWidget(table);
 
        auto model=new QStandardItemModel;
        model->setRowCount(5);
        model->setColumnCount(5);
 
        for(int r=0; r<model->rowCount(); r++)
            for(int c=0; c<model->columnCount(); c++)
                model->setItem(r,c, new QStandardItem(QString::number(rand()%100)));
 
        table->setModel(model);
        table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
 
        QModelIndex idxMax, idxMin=model->index(0,0);
 
        for(int r=0; r<model->rowCount(); r++){
            for(int c=0; c<model->columnCount(); c++){
 
                auto currentIdx=model->index(r,c);
 
                if(currentIdx.data().toInt() > idxMax.data().toInt())
                    idxMax=currentIdx;
                if(currentIdx.data().toInt() < idxMin.data().toInt())
                    idxMin=currentIdx;
            }
        }
 
 
        auto hLayout=new QHBoxLayout;
        auto btnMax=new QPushButton("max");
        auto btnMin=new QPushButton("min");
 
        hLayout->addStretch();
        hLayout->addWidget(btnMax);
        hLayout->addWidget(btnMin);
 
        layout->addLayout(hLayout);
        layout->addStretch();
 
        connect(btnMax, &QAbstractButton::clicked, this, [idxMax, model]{
 
            if(idxMax.isValid())
                model->itemFromIndex(idxMax)->setBackground(Qt::green);
        });
 
        connect(btnMin, &QAbstractButton::clicked, this, [idxMin, model]{
 
            if(idxMin.isValid())
                model->itemFromIndex(idxMin)->setBackground(Qt::red);
        });
 
    }
 
    virtual ~form(){}
 
};


Добавлено через 3 минуты

хм, не выводится в консоль? должно бы... я хз
Всё равно ошибка, но только другая: variable 'QApplication app' has initializer but incomplete type QApplication app(argc, argv);
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 02:31
Nepravilon, я уже не соображаю ничерта, подзапарился за сегодня , хз что за ошибка...
main. cpp должен выглядеть примерно так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include <QApplication>
#include "ваше_название_файла_с_кодом.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    
 
    form f; f.show();
 
    return a.exec();
}
Еще, просматривая код от kapbepucm, я понял, что пропедалил один ньюанс:
Максимум или минимум могут же повторятся в нескольких ячейках.
Надо будет переделать, но уже завтра, может быть, исправлю.

А пока берите вариант от kapbepucm, он правильный.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
16.02.2023, 12:53  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Nepravilon, я уже не соображаю ничерта, подзапарился за сегодня , хз что за ошибка...
main. cpp должен выглядеть примерно так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include <QApplication>
#include "ваше_название_файла_с_кодом.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    
 
    form f; f.show();
 
    return a.exec();
}
Еще, просматривая код от kapbepucm, я понял, что пропедалил один ньюанс:
Максимум или минимум могут же повторятся в нескольких ячейках.
Надо будет переделать, но уже завтра, может быть, исправлю.

А пока берите вариант от kapbepucm, он правильный.
Хорошо, спасибо большое ещё раз))

Добавлено через 22 минуты
И прошу прощения 1000 раз, что побеспокоил)))

Добавлено через 21 минуту
Кста, я разобрался как сделать подсветку, только другая проблемка:

У меня числа генерируются, а цвет остаётся на прежних местах и не меняется совсем:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <QApplication>
#include <QTableView>
#include <QRandomGenerator>
#include <QStandardItemModel>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
 
#define MIN 0
#define MAX 100
 
class Table: public QTableView
{
  int minValue = MAX; // т.е. равен 100
  int maxValue = MIN; // т.е. равен 0
 
public:
  Table(): QTableView()
  {
    QStandardItemModel* model = new QStandardItemModel(7,7);
    setModel(model);
    for (int row = 0; row < 7; ++row)
      for (int col = 0; col < 7; ++col)
      {
        int val = QRandomGenerator::global()->bounded(MIN, MAX);
        if (minValue > val)
          minValue = val;
        if (maxValue < val)
          maxValue = val;
        QStandardItem* item = new QStandardItem;
        item->setData(val);
        item->setText(QString::number(val));
        model->setItem(row, col, item);
      }
  }
 
  void generate()
  {
      QStandardItemModel* m = static_cast<QStandardItemModel*>(model());
      QItemSelectionModel* sm = selectionModel();
      QModelIndex index;
      sm->clear();
      for(int row = 0; row < 7; ++row)
      {
          for(int col = 0; col < 7; ++col)
          {
              index = m->index(row, col);
              m->setData(index,rand()%100); // генерация случайных чисел
          }
      }
  }
 
  void selectMin()
  {
    QStandardItemModel* m = static_cast<QStandardItemModel*>(model());
    QItemSelectionModel* sm = selectionModel();
    sm->clear();
    for (int row=0; row<7; ++row)
      for (int col=0; col<7; ++col)
        if (minValue == m->item(row,col)->data().toInt())
          m->item(row, col)->setBackground(Qt::red); // подсветка мин. эл.
  }
  void selectMax()
  {
    QStandardItemModel* m = static_cast<QStandardItemModel*>(model());
    QItemSelectionModel* sm = selectionModel();
    sm->clear();
    for (int row=0; row<7; ++row)
      for (int col=0; col<7; ++col)
        if (maxValue == m->item(row,col)->data().toInt())
            m->item(row, col)->setBackground(Qt::green); // подсветка макс. эл.
  }
};
class Window: public QWidget
{
public:
  Window(): QWidget()
  {
    Table* table = new Table();
    QPushButton* generateButton = new QPushButton("Сгенерировать значения");
    connect(generateButton, &QPushButton::clicked, table, &Table::generate);
    QPushButton* maxButton = new QPushButton("Максимальный элемент");
    connect(maxButton, &QPushButton::clicked, table, &Table::selectMax);
    QPushButton* minButton = new QPushButton("Минимальный элемент");
    connect(minButton, &QPushButton::clicked, table, &Table::selectMin);
    QVBoxLayout* l = new QVBoxLayout;
 
    l->addWidget(table);
    l->addWidget(generateButton);
    l->addWidget(minButton);
    l->addWidget(maxButton);
    setLayout(l);
  }
};
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  Window window;
  window.show();
  window.resize(750,370);
  return app.exec();
}
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 14:41
Лучший ответ Сообщение было отмечено Nepravilon как решение

Решение

Переписал, для MainWindow.
Код старался сделать максимально простым.
Не использовал массив, не высчитывал сумму и среднее, а еще можно добавить спинбоксы для задания размеров таблицы. Это уже сами потренируйтесь, если хотите
(Правильно/нет - переделывать уже не буду, и так 30+ постов в теме , но если надо пояснить по коду-спрашивайте)

Кликните здесь для просмотра всего текста

таблица и модель, индексы макс и мин сделал полями класса для удобства
констант для размеров таблицы или цветов ячеек не задавал

mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QModelIndex>
 
class QTableView;
class QStandardItemModel;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    QTableView *table;
    QStandardItemModel *model;
    QModelIndex idxMax, idxMin;
 
private:
    void resetModel();
    void colorizeSimilar(QString text, QColor color);
    void selectSimilar(QString text);
};
 
#endif // MAINWINDOW_H

mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "mainwindow.h"
 
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setStyleSheet("background:lightGray;");
 
    auto form=new QWidget;
    setCentralWidget(form);
 
    //компоновка
    auto layout = new QVBoxLayout;
    form->setLayout(layout);
 
    table=new QTableView;
    layout->addWidget(table);
    model=new QStandardItemModel;
    model->setRowCount(10);//размер таблицы
    model->setColumnCount(10);
 
    table->setModel(model);
    table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
    resetModel();//заполнить таблицу
 
    auto hLayout=new QHBoxLayout;
    auto btnColorizeMax=new QPushButton("colorize max");
    auto btnColorizeMin=new QPushButton("colorize min");
    auto btnReset=new QPushButton("reset");
    auto btnSelectMax=new QPushButton("select max");
    auto btnSelectMin=new QPushButton("select min");
 
    hLayout->addWidget(btnReset);
    hLayout->addStretch();
    hLayout->addWidget(btnColorizeMax);
    hLayout->addWidget(btnColorizeMin);
    hLayout->addSpacing(50);
    hLayout->addWidget(btnSelectMax);
    hLayout->addWidget(btnSelectMin);
 
    layout->addLayout(hLayout);
    layout->addStretch();
 
 
    //коннекты на кнопки
    //закрасить ячейки максимума
    connect(btnColorizeMax, &QAbstractButton::clicked, this, [this]{
 
        if(!table)
            return;
        if(idxMax.isValid())
            colorizeSimilar(idxMax.data().toString(), Qt::green);
    });
 
    //закрасить ячейки минимума
    connect(btnColorizeMin, &QAbstractButton::clicked, this, [this]{
 
        if(!table)
            return;
        if(idxMin.isValid())
            colorizeSimilar(idxMin.data().toString(), Qt::red);
    });
 
    //выделить ячейки максимума
    connect(btnSelectMax, &QAbstractButton::clicked, this, [this]{
 
        if(!table || !table->selectionModel())
            return;
        if(idxMax.isValid()){
 
            table->setFocus();
            selectSimilar(idxMax.data().toString());
        }
    });
 
    //выделить ячейки минимума
    connect(btnSelectMin, &QAbstractButton::clicked, this, [this]{
 
        if(!table || !table->selectionModel())
            return;
        if(idxMin.isValid()){
 
            table->setFocus();
            selectSimilar(idxMin.data().toString());
        }
    });
 
    //перезаполнить таблицу
    connect(btnReset, &QAbstractButton::clicked, this, &MainWindow::resetModel);
}
 
 
MainWindow::~MainWindow()
{
}
 
 
//Реализация методов
//перезаполнить таблицу
void MainWindow::resetModel()
{
    if(!table)return;
 
    if(QStandardItemModel *model=dynamic_cast<QStandardItemModel*>(table->model()))
    {
        //заполнить случайными int до 100
        for(int r=0; r<model->rowCount(); r++)
            for(int c=0; c<model->columnCount(); c++){
 
                auto item=new QStandardItem(QString::number(rand()%100));
                item->setTextAlignment(Qt::AlignCenter);
                model->setItem(r,c, item);
            }
 
        //найти максимум и минимум (как индекс ячейки в таблице)
        idxMax, idxMin=model->index(0,0);
 
        for(int r=0; r<model->rowCount(); r++){
            for(int c=0; c<model->columnCount(); c++){
 
                auto currentIdx=model->index(r,c);
 
                if(currentIdx.data().toInt() > idxMax.data().toInt())
                    idxMax=currentIdx;
                if(currentIdx.data().toInt() < idxMin.data().toInt())
                    idxMin=currentIdx;
            }
        }
    }
}
 
 
//закрасить ячейки с текстом text 
void MainWindow::colorizeSimilar(QString text, QColor color)
{
    table->selectionModel()->clear();
 
    for(int r=0; r<model->rowCount(); r++)
        for(int c=0; c<model->columnCount(); c++)
            if(model->item(r, c)->data(Qt::DisplayRole).toString()==text)
                model->item(r, c)->setBackground(color);
}
 
 
//выделить ячейки с текстом text
void MainWindow::selectSimilar(QString text)
{
    table->selectionModel()->clear();
 
    for(int r=0; r<model->rowCount(); r++)
        for(int c=0; c<model->columnCount(); c++){
 
            if(model->item(r, c)->data(Qt::DisplayRole).toString()==text){
 
                QModelIndex idx=model->index(r,c);
                if(idx.isValid())
                    table->selectionModel()->select(idx,QItemSelectionModel::Select);
            }
        }
}


Добавлено через 8 минут
зы рандом кстати забыл поставить нормальный, если требуется-поменяйте.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
16.02.2023, 14:44  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Переписал, для MainWindow.
Код старался сделать максимально простым.
Не использовал массив, не высчитывал сумму и среднее, а еще можно добавить спинбоксы для задания размеров таблицы. Это уже сами потренируйтесь, если хотите
(Правильно/нет - переделывать уже не буду, и так 30+ постов в теме , но если надо пояснить по коду-спрашивайте)

Кликните здесь для просмотра всего текста

таблица и модель, индексы макс и мин сделал полями класса для удобства
констант для размеров таблицы или цветов ячеек не задавал

mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QModelIndex>
 
class QTableView;
class QStandardItemModel;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    QTableView *table;
    QStandardItemModel *model;
    QModelIndex idxMax, idxMin;
 
private:
    void resetModel();
    void colorizeSimilar(QString text, QColor color);
    void selectSimilar(QString text);
};
 
#endif // MAINWINDOW_H

mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "mainwindow.h"
 
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setStyleSheet("background:lightGray;");
 
    auto form=new QWidget;
    setCentralWidget(form);
 
    //компоновка
    auto layout = new QVBoxLayout;
    form->setLayout(layout);
 
    table=new QTableView;
    layout->addWidget(table);
    model=new QStandardItemModel;
    model->setRowCount(10);//размер таблицы
    model->setColumnCount(10);
 
    table->setModel(model);
    table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
    resetModel();//заполнить таблицу
 
    auto hLayout=new QHBoxLayout;
    auto btnColorizeMax=new QPushButton("colorize max");
    auto btnColorizeMin=new QPushButton("colorize min");
    auto btnReset=new QPushButton("reset");
    auto btnSelectMax=new QPushButton("select max");
    auto btnSelectMin=new QPushButton("select min");
 
    hLayout->addWidget(btnReset);
    hLayout->addStretch();
    hLayout->addWidget(btnColorizeMax);
    hLayout->addWidget(btnColorizeMin);
    hLayout->addSpacing(50);
    hLayout->addWidget(btnSelectMax);
    hLayout->addWidget(btnSelectMin);
 
    layout->addLayout(hLayout);
    layout->addStretch();
 
 
    //коннекты на кнопки
    //закрасить ячейки максимума
    connect(btnColorizeMax, &QAbstractButton::clicked, this, [this]{
 
        if(!table)
            return;
        if(idxMax.isValid())
            colorizeSimilar(idxMax.data().toString(), Qt::green);
    });
 
    //закрасить ячейки минимума
    connect(btnColorizeMin, &QAbstractButton::clicked, this, [this]{
 
        if(!table)
            return;
        if(idxMin.isValid())
            colorizeSimilar(idxMin.data().toString(), Qt::red);
    });
 
    //выделить ячейки максимума
    connect(btnSelectMax, &QAbstractButton::clicked, this, [this]{
 
        if(!table || !table->selectionModel())
            return;
        if(idxMax.isValid()){
 
            table->setFocus();
            selectSimilar(idxMax.data().toString());
        }
    });
 
    //выделить ячейки минимума
    connect(btnSelectMin, &QAbstractButton::clicked, this, [this]{
 
        if(!table || !table->selectionModel())
            return;
        if(idxMin.isValid()){
 
            table->setFocus();
            selectSimilar(idxMin.data().toString());
        }
    });
 
    //перезаполнить таблицу
    connect(btnReset, &QAbstractButton::clicked, this, &MainWindow::resetModel);
}
 
 
MainWindow::~MainWindow()
{
}
 
 
//Реализация методов
//перезаполнить таблицу
void MainWindow::resetModel()
{
    if(!table)return;
 
    if(QStandardItemModel *model=dynamic_cast<QStandardItemModel*>(table->model()))
    {
        //заполнить случайными int до 100
        for(int r=0; r<model->rowCount(); r++)
            for(int c=0; c<model->columnCount(); c++){
 
                auto item=new QStandardItem(QString::number(rand()%100));
                item->setTextAlignment(Qt::AlignCenter);
                model->setItem(r,c, item);
            }
 
        //найти максимум и минимум (как индекс ячейки в таблице)
        idxMax, idxMin=model->index(0,0);
 
        for(int r=0; r<model->rowCount(); r++){
            for(int c=0; c<model->columnCount(); c++){
 
                auto currentIdx=model->index(r,c);
 
                if(currentIdx.data().toInt() > idxMax.data().toInt())
                    idxMax=currentIdx;
                if(currentIdx.data().toInt() < idxMin.data().toInt())
                    idxMin=currentIdx;
            }
        }
    }
}
 
 
//закрасить ячейки с текстом text 
void MainWindow::colorizeSimilar(QString text, QColor color)
{
    table->selectionModel()->clear();
 
    for(int r=0; r<model->rowCount(); r++)
        for(int c=0; c<model->columnCount(); c++)
            if(model->item(r, c)->data(Qt::DisplayRole).toString()==text)
                model->item(r, c)->setBackground(color);
}
 
 
//выделить ячейки с текстом text
void MainWindow::selectSimilar(QString text)
{
    table->selectionModel()->clear();
 
    for(int r=0; r<model->rowCount(); r++)
        for(int c=0; c<model->columnCount(); c++){
 
            if(model->item(r, c)->data(Qt::DisplayRole).toString()==text){
 
                QModelIndex idx=model->index(r,c);
                if(idx.isValid())
                    table->selectionModel()->select(idx,QItemSelectionModel::Select);
            }
        }
}


Добавлено через 8 минут
зы рандом кстати забыл поставить нормальный, если требуется-поменяйте.
Офигеть, спасибо большое! Вот теперь работает, как надо)))

Добавлено через 53 секунды
зы рандом кстати забыл поставить нормальный, если требуется-поменяйте.
а что не так с рандомом? Он отлично работает ))
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2023, 14:47
ЗЫ ЗЫ я думаю, Вам стоит дальше использовать вариант от kapbepucm, как он имхо более красиво написан.
Свой вариант я выложил чтобы уже не оставлять недоделок

Добавлено через 2 минуты
Цитата Сообщение от Nepravilon Посмотреть сообщение
а что не так с рандомом? Он отлично работает ))
не совсем-он генерит последовательности, которые повторяются каждый раз при перезапуске программы.
Посмотрите как у kapbepucm, -там более правильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2023, 14:47
Помогаю со студенческими работами здесь

Работа со стеком (найти мин и макс элемент)
есть стек struct Stack { int info; //значение элемента Stack * next; //указатель на следующий элемент...

Найти макс и мин элемент вектора и матрицы
import numpy as np from random import random #from math import pi n = 5 i = n j = n def funA(i,j): y =...

Дан массив из n чисел. Найти мин и макс элемент.
длину массива вводишь после запуска прогр. Помогите решить и если не тяжело ещё и объяснить.

Через массив найти мин. и макс. элемент в множестве отрицательных чисел
Через массив найти минимальный и максимальный элемент в множестве отрицательных чисел

Найти макс и мин элемент в строках массива и поместить их на место первого и последнего
Подскажите пожалуйста, нахожу элементы, но не знаю как их поставить на первое и последнее место int n, m; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru