Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
1

Правильно ли я работаю с QTableWidget?

02.06.2016, 09:11. Показов 5618. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем, такой вопрос: мне нужно ввести в таблицу неск. цифр и потом по нажатию кнопки закрасить ячейки с введёнными данными в цвет. Если я делаю вот так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
        {
            QTableWidgetItem *item1 = new QTableWidgetItem;
            item1 = ui->tableWidget->item(i,j);
 
            str = item1->text();
            if(str == "") item1->setBackground(Qt::yellow);
            ui->tableWidget->setItem(i, j, item1);
        }
то программа рушится без объяснений. Чтобы не рушилась, в конструктор формы я добавил костыль:

C++ (Qt)
1
2
3
4
5
6
7
8
9
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
        {
            QTableWidgetItem *item1 = new QTableWidgetItem();
 
            item1->setText("");
            ui->tableWidget->setItem(i, j, item1);
 
        }
Так всё работает, хотя выскакивают какие-то сообщения: QTableWidget: cannot insert an item that is already owned by another QTableWidget

Программа запускается, я ввожу в произвольные ячейки таблицы текст, нажимаю кнопку - ячейки с текстом закрашиваются. Но одолевают сомнения - это действительно так нужно в конструкторе пустые строки в каждую ячейку записывать? Чтобы потом из полупустой таблицы что-то прочитать?


И ещё вопрос, чтобы не создавать новую тему: можно ли в таблице выделить (цветом и/или толщиной) отдельные линии, из которых таблица состоит?
Миниатюры
Правильно ли я работаю с QTableWidget?  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2016, 09:11
Ответы с готовыми решениями:

Правильно ли я работаю с QSharedPointer и QVBoxLayout
Правильно ли я работаю с QSharedPointer и QVBoxLayout, вот такой кусок кода: QSharedPointer &lt;...

Подключаю мониторы с Video splitter и они работаю не правильно
Проблема такая : Проблема на данный момент : Подключаю сплиттер к видео карте и после этого -...

QTableWidget (1) >>> QTableWidget (2) исключить повторяющиеся строки
Добрый день. Подскажите как лучше реализовать... Хочу реализовать исключение повторяющихся...

не работаю if
#include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

13
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
02.06.2016, 19:30 2
Суть в том, что даже если ты задаёшь размеры таблицы, сами item от этого не создаются. Поэтом обращаться надо с предварительной проверкой. Вот установка жёлтого фона для непустых ячеек:
C++ (Qt)
1
2
3
4
5
6
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
        {
            QTableWidgetItem * item1 = ui->tableWidget->item(i,j);
            if (item1 != NULL && !item1->text().isEmpty()) item1->setBackground(Qt::yellow);
        }
1
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
03.06.2016, 01:24  [ТС] 3
Спасибо. А по второму вопросу - возможны линии разной толщины? Если невозможно средствами таблицы - можно рисовать вручную поверх таблицы?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
03.06.2016, 09:02 4
Цитата Сообщение от alexu_007 Посмотреть сообщение
возможны линии разной толщины?
Нет.
Цитата Сообщение от alexu_007 Посмотреть сообщение
можно рисовать вручную поверх таблицы?
Ну можешь попробовать переопределить paintEvent().
0
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
03.06.2016, 11:23 5
alexu_007,
Цитата Сообщение от alexu_007 Посмотреть сообщение
возможны линии разной толщины?
Возможны, для этого тебе надо переопределить стили таблицы. Смотри в сторону QStyle.
гляди - https://habrahabr.ru/post/149687/
0
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
03.07.2016, 12:16  [ТС] 6
Нарисовал вот такую таблицу. Содержимое таблицы перерисовывается функцией:

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
// цветные квадратики
QColor fn_getColor(int j, int i)
{
    QColor clr;
 
    if(i < 3 && j < 3)              clr = Qt::yellow;
    if(i < 3 && (j > 2 && j < 6))   clr = Qt::white;
    if(i < 3  && j > 5)             clr = Qt::yellow;
    if((i > 2 && i < 6) && j < 3)   clr = Qt::white;
 
    if((i > 2 && i < 6) && (j > 2 && j < 6))
                                    clr = Qt::yellow;
 
    if((i > 2 && i < 6) && j > 5)   clr = Qt::white;
 
    if(i > 5 && j < 3)              clr = Qt::yellow;
    if(i > 5 && (j > 2 && j < 6))   clr = Qt::white;
    if(i > 5  && j > 5)             clr = Qt::yellow;   //QColor(0, 200, 200, trp);
 
return clr;
}
 
 
 
 
 
 
// печатает инфу из buf_sudoku в таблицу
void Widget::print_Table()
{
    QFont font;
 
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
        {
            QTableWidgetItem *item1 = new QTableWidgetItem;
 
            item1->setBackgroundColor(fn_getColor(i, j));
 
 
            if(buf_input[i][j] == buf_sudoku[i][j])
            {
                font.setPointSize(14);
                font.setBold(true);
            }
 
            else
            {
                font.setPointSize(12);
                font.setBold(false);
            }
 
            item1->setFont(font);
 
            // изменение цвета шрифта
            //color = Qt::black;
            //item1->setData(Qt::TextColorRole, color);
 
            item1->setTextAlignment(Qt::AlignCenter);
            item1->setText(buf_sudoku[i][j]);
 
            ui->tableWidget->setItem(i, j, item1);
        }
}
Функция вызывается несколько раз: в конструкторе и при нажатии кнопок. При повторном вызове функции в вывод приложения выводится многа строк (я не считал, но подозреваю, что их 81 - по числу ячеек в таблице) следующего содержания:

QTableWidget: cannot insert an item that is already owned by another QTableWidget
перевод: QTableWidget: не может вставить элемент, который уже принадлежит другому QTableWidget

При этом программа работает нормально и таблица показывает всё правильно. Что это может быть? Неправильная работа с таблицей?
Миниатюры
Правильно ли я работаю с QTableWidget?  
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
03.07.2016, 18:33 7
Цитата Сообщение от alexu_007 Посмотреть сообщение
Что это может быть?
Ты где-то вставляешь QTableWidgetItem, который уже используется.
0
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
24.04.2018, 08:28  [ТС] 8
Sorry, что старую тему реанимирую - но проблема так и не решена. Как повторно использовать item для того, что-бы переписать информацию в таблице?

Я изначально записываю инфу в таблицу кодом:

C++ (Qt)
1
2
3
4
5
6
7
8
9
    for(int i = 0; i < 33; i++)
    {
        QTableWidgetItem *item = new QTableWidgetItem;
        str = stralf.at(i);
        item->setText(str);
        item->setTextAlignment(Qt::AlignCenter);
 
        ui->tableWidget_01->setItem(0, i, item);
    }
Как (например по нажатию другой кнопки) поменять инфу в таблице? Если я повторю этот код, с другими данными - то как раз и пишет сообщение: QTableWidget: cannot insert an item that is already owned by another QTableWidget. Как не объявлять новый item, а получить и переписать существующий?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
24.04.2018, 08:46 9
Тебе же показали как надо делать. Сначала запрашиваешь item у таблицы и только если он не существует, создаёшь новый.
0
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
24.04.2018, 10:06  [ТС] 10
А если существует? Если переписывать существующий, то как раз сообщение и выскакивает:
C++ (Qt)
1
2
3
4
5
6
    QTableWidgetItem *item = ui->tableWidget_01->item(x, y);
 
    if(item == NULL) return;
 
    item->setText("@");
    ui->tableWidget_01->setItem(0, i, item);
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
24.04.2018, 10:20 11
Цитата Сообщение от alexu_007 Посмотреть сообщение
А если существует? Если переписывать существующий
Зачем ты его на его же место пытаешься ещё раз "засунуть". Сделай void QTableWidgetItem::setData(int role, const QVariant &value) для нужного item'а. А ля:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    static int test = 0;
    if(!ui->tableWidget->item(0,0))
    {
        ui->tableWidget->setItem(0,0,new QTableWidgetItem(QString(test)));
    }
    else
    {
        ui->tableWidget->item(0,0)->setData(Qt::DisplayRole,QString(test));
    }
    test++;
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
24.04.2018, 10:55 12
Цитата Сообщение от alexu_007 Посмотреть сообщение
А если существует?
А если существует, то просто меняешь в нём текст через полученный указатель. У тебя же это есть - setText().
0
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,080
24.04.2018, 11:01  [ТС] 13
Во спасибо, это помогло. Можно даже чуть проще:

C++ (Qt)
1
ui->tableWidget->item(0,0)->setText(str);
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
24.04.2018, 11:12 14
Без проверки ты можешь попасть на NULL.
1
24.04.2018, 11:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2018, 11:12
Помогаю со студенческими работами здесь

Работаю с ArrayList
Всем привет, возникла трудность, нужно организовать arraylist который будет в себе хранить key,...

Не работаю сервисы
Не работают сервисы : сети , Брандмауэр, возможно еще какие-то. Заранее спасибо!

Работаю в GLScene
Перечитал всякой литературы, даже демки смотрел, но все равно не получается у меня сделать коллизию...

Не работаю браузеры
У меня не Работают браузеры хотя сам интернет пашет работает скайп и т.п некоторые сайты открывает...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru