Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
1

QtTableWidget

23.05.2016, 12:05. Просмотров 176. Ответов 16
Метки нет (Все метки)

У меня есть таблица , и мне нужно :
1)у нее записать(считать с файла) значения. И чтобы в каждую ячейку нужная информация записывалась. Как мне считать и нормально записать
2) Чтобы при нажатии например на Car (выставлялись значения по алфавиту(туда, обратно)).
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
#include "CarsTable.h"
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
    const int number = 4;
 
    QApplication      app(argc, argv);
    QTableWidget      tableWidget(number, number);
    QTableWidgetItem* tableWidgetItem = 0;
    QStringList       stringList;
    QFile file("D:/cars.txt");
 
    stringList << "#" << "Year Released" << "Car" << "Color";
    tableWidget.setHorizontalHeaderLabels(stringList);
 
 
    for (int index  = 0; index < number; ++index)
    {
       tableWidgetItem = new QTableWidgetItem(QString("%1").arg(index));
       if (file.open(QIODevice::ReadOnly | QIODevice::Text))
       {
           QTextStream textStream(&file);
           while (!textStream.atEnd())
             stringList.append(textStream.readLine());
       }
    }
    tableWidget.resize(370, 135);
    tableWidget.show();
 
    return app.exec();
}
текс в файле:
Код
1945,Audi,red    
1978,BWM,blue
1922,Ford,yelow  
1990,Honda,black    
1994,Hyundai,gold
1991,Kia,black    
1995,Mazda,gold  
1934,Mercedes-Benz,red   
1992,Mitsubishi,green   
2000,Nissan,gold  
2013,Renault,black   
1978,Skoda,red   
2012,Toyota,green   
2015,Volkswagen,black
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2016, 12:05
Ответы с готовыми решениями:

QtTableWidget плохо перерисовывается
QtTableWidget, плохо перерисовывается прямоугольник. У меня есть доска 4 на 4 и там 16 карт. Я в...

Не работают ctrl +c ctrl + v в QtTableWidget
Здравствуйте. вопрос, по сути, в теме: как связать таблицу, с буфером, ну чтобы как и в обычных...


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

Или воспользуйтесь поиском по форуму:
16
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
23.05.2016, 12:19  [ТС] 2
Проект:
0
Вложения
Тип файла: zip CarsTable.zip (3.9 Кб, 3 просмотров)
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
23.05.2016, 14:06  [ТС] 3
файл
0
Вложения
Тип файла: txt Cars.txt (294 байт, 5 просмотров)
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
23.05.2016, 21:48  [ТС] 4
код:
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
#include "CarsTable.h"
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
    const int row = 14;
    const int col = 4;
 
    QApplication      app(argc, argv);
    QTableWidget      tableWidget(row, col);
    QTableWidgetItem* tableWidgetItem = 0;
    QStringList       stringList;
    QFile file("D:/cars.txt");
 
    stringList << "#"  << "Year Released" << "Car" << "Color";
    tableWidget.setHorizontalHeaderLabels(stringList);
 
 
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(0, "error", file.errorString());
    }
 
    QTextStream сars(&file);
    int index = 0;
 
    while(!сars.atEnd())
    {
     QString line = сars.readLine();
         QStringList fields = line.split(",");
 
     tableWidgetItem = new QTableWidgetItem(QString("%1").arg(index + 1));
            tableWidget.setItem(index, 0, tableWidgetItem);
 
            for (int j =0; j < 3; ++j)
            {
                tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(j)));
                tableWidget.setItem(index, j + 1, tableWidgetItem);
            }
     ++index;
    }
    tableWidget.resize(370, 135);
    tableWidget.show();
 
    return app.exec();
}
Но как прибрать цифры слава около таблицы, я хз. А то они дублюються с моими номерами.

Добавлено через 7 часов 1 минуту
Решила переделать часть коду, хочу додавать колонки и рядок
написала код для добавления колонки
C++ (Qt)
1
2
3
4
5
6
7
8
QTableWidget tableWidget(0, 0);
    QTableWidgetItem* tableWidgetItemYear = new QTableWidgetItem(QString("%1").arg(("Year Released")));
    QTableWidgetItem* tableWidgetItemСar = new QTableWidgetItem(QString("%1").arg(("Car")));
    QTableWidgetItem* tableWidgetItemСolor = new QTableWidgetItem(QString("%1").arg(("Color")));
    tableWidget.insertColumn(3);
    tableWidget.setItem(1, 1, tableWidgetItemYear);
    tableWidget.setItem(1, 2, tableWidgetItemСar);
    tableWidget.setItem(1, 3, tableWidgetItemСolor);
но оно не додает, не показывается на екране подскажите почему оно не додает?

Добавлено через 18 минут
+ я хочу по одному додавать row, я думала делать это в ифе, Правильно я думаю? Но как там именно это сделать?
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
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
 
    QApplication app(argc, argv);
    QTableWidget tableWidget();
 
    QFile file("D:/cars.txt");
    if (!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(0, "error", file.errorString());
    }
 
    QTextStream textStream(&file);
    for (int row = 0; !textStream.atEnd(); ++row)
    {
        QString line = textStream.readLine();
        QStringList fields = line.split(",");
 
        for (int col = 0; col < 3; ++col)
        {
            QTableWidgetItem* tableWidgetItemYear = new QTableWidgetItem(QString("%1").arg(("Year Released")));
            QTableWidgetItem* tableWidgetItemСar = new QTableWidgetItem(QString("%1").arg(("Car")));
            QTableWidgetItem* tableWidgetItemСolor = new QTableWidgetItem(QString("%1").arg(("Color")));
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
 
            tableWidget.setItem(row, col, tableWidgetItemYear);
            tableWidget.setItem(row, col, tableWidgetItemСar);
            tableWidget.setItem(row, col, tableWidgetItemСolor);
            tableWidget.setItem(row, col, tableWidgetItem);
            tableWidget.insertColumn(col);
        }
       tableWidget.insertRow(row);
    }
    tableWidget.resize(330, 445);
    tableWidget.show();
 
    return app.exec();
}
0
ldir82
47 / 44 / 19
Регистрация: 31.03.2014
Сообщений: 205
23.05.2016, 22:16 5
Вот это поток мыслей!!!! Ну прямо винегрет. Хрен поймешь, че да как. Но самое интересное, что хоть как-то работает.
Кстати, вместо
C++ (Qt)
1
new QTableWidgetItem(QString("%1").arg(("Year Released")))
можно написать
C++ (Qt)
1
new QTableWidgetItem("Year Released")
Это немного улучшит читабельность. А вообще мой мозг закипел. Привет девушке из Украины.
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
23.05.2016, 22:56  [ТС] 6
ldir82, та я просто не знаю как сделать, написала сюда, потом сама уже решила проблему, скинула код. и т.д.
Мне нужно зараз сделать:
1) додавать row и col постепенно. А сначала у меня таблица пустая(0,0). Но я тут уже запуталась и незнаю почему не работает) .
Часть кода, где я это делаю(додаю по 1 )

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 for (int row = 0; !textStream.atEnd(); ++row)
    {
        QString line = textStream.readLine();
        QStringList fields = line.split(",");
 
        for (int col = 0; col < 3; ++col)
        {
            QTableWidgetItem* tableWidgetItemYear = new QTableWidgetItem("Year Released");
            QTableWidgetItem* tableWidgetItemСar = new QTableWidgetItem("Car");
            QTableWidgetItem* tableWidgetItemСolor = new QTableWidgetItem("Color");
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
 
            tableWidget.setItem(row, col, tableWidgetItemYear);
            tableWidget.setItem(row, col, tableWidgetItemСar);
            tableWidget.setItem(row, col, tableWidgetItemСolor);
            tableWidget.setItem(row, col, tableWidgetItem);
            tableWidget.insertColumn(col);
        }
       tableWidget.insertRow(row);
    }
Привет)
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.05.2016, 23:27 7
Цитата Сообщение от natalyPod Посмотреть сообщение
Но я тут уже запуталась и незнаю почему не работает) .
Вам надо изучить MVC, применяемую Qt.
Пока что то, что вы пишете крайне не логично. К примеру, вы создаёте несколько элементов со значениями "Year Released", "Car" и пытаетесь их все поместить в одну ячейку таблицы, которая к тому же не существует(ибо столбец и строки добавляются после).
Для того, чтобы что-то куда-то в таблице можно было поместить, вначале это "куда-то" нужно создать. То есть создаёте столбцы, строки и только потом их можно заполнять. "Year Released" и прочие названия столбцов к обычным элементам таблицы не относятся. Они должны именовать сами столбцы(их header), как у вас делается в вашем первом сообщении.
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
24.05.2016, 10:16  [ТС] 8
Wyn,
Код
Они должны именовать сами столбцы(их header), как у вас делается в вашем первом сообщении.
не совсем поняла, о чем Вы.
Код
Пока что то, что вы пишете крайне не логично. К примеру, вы создаёте несколько элементов со значениями "Year Released", "Car" и пытаетесь их все поместить в одну ячейку таблицы, которая к тому же не существует(ибо столбец и строки добавляются после).
а я помещаю в 1 ячейку? я ж в цикле это делаю, я думала оно будет помещать в разные.
0
alexu_007
154 / 168 / 35
Регистрация: 29.05.2015
Сообщений: 1,163
24.05.2016, 11:01 9
Цитата Сообщение от natalyPod Посмотреть сообщение
а я помещаю в 1 ячейку? я ж в цикле это делаю, я думала оно будет помещать в разные.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
        for (int col = 0; col < 3; ++col)
        {
            QTableWidgetItem* tableWidgetItemYear = new QTableWidgetItem("Year Released");
            QTableWidgetItem* tableWidgetItemСar = new QTableWidgetItem("Car");
            QTableWidgetItem* tableWidgetItemСolor = new QTableWidgetItem("Color");
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
 
            tableWidget.setItem(row, col, tableWidgetItemYear);
            tableWidget.setItem(row, col, tableWidgetItemСar);
            tableWidget.setItem(row, col, tableWidgetItemСolor);
            tableWidget.setItem(row, col, tableWidgetItem);
            tableWidget.insertColumn(col);
        }
при первом проходе все значения запишутся в ячейку 0,0, потом в 0,1 и так далее - то есть везде будет последнее значение. Этот цикл не нужен, нужно записывать в

C++ (Qt)
1
2
3
4
            tableWidget.setItem(row, 0, tableWidgetItemYear);
            tableWidget.setItem(row, 1, tableWidgetItemСar);
            tableWidget.setItem(row, 2, tableWidgetItemСolor);
            tableWidget.setItem(row, 3, tableWidgetItem);
тогда в первой строке запишется 4 ячейки и так далее.
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
24.05.2016, 12:17  [ТС] 10
Wyn, Хелп!!!
Переделала, но теперь названия сверху не пишуться. Подскажите как это исправить. у меня уже мозги плавятся
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
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
 
    QApplication app(argc, argv);
    QTableWidget tableWidget(0,0);
    QStringList  stringList;
 
    stringList << "Year Released" << "Car" << "Color";
    tableWidget.setHorizontalHeaderLabels(stringList);
 
 
    QFile file("D:/cars.txt");
    if (!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(0, "error", file.errorString());
    }
 
    QTextStream textStream(&file);
 
    tableWidget.insertColumn(0);
    tableWidget.insertColumn(1);
    tableWidget.insertColumn(2);
    for (int row = tableWidget.rowCount(); !textStream.atEnd(); ++row)
    {
        QString line = textStream.readLine();
        QStringList fields = line.split(",");
 
        tableWidget.insertRow(row);
 
        for (int col = 0; col < 3; ++col)
        {
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
            tableWidget.setItem(row, col, tableWidgetItem);
        }
    }
    tableWidget.resize(330, 445);
    tableWidget.show();
 
    return app.exec();
}
0
alexu_007
154 / 168 / 35
Регистрация: 29.05.2015
Сообщений: 1,163
24.05.2016, 12:18 11
f
C++ (Qt)
1
or (int col = 0; col <= 3; ++col)
Вот этот цикл не нужен. Вот так где-то:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (int row = 0; !textStream.atEnd(); ++row)
    {
        QString line = textStream.readLine();
        QStringList fields = line.split(",");
 
            QTableWidgetItem* tableWidgetItemYear = new QTableWidgetItem("Year Released");
            QTableWidgetItem* tableWidgetItemСar = new QTableWidgetItem("Car");
            QTableWidgetItem* tableWidgetItemСolor = new QTableWidgetItem("Color");
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
 
            tableWidget.setItem(row, 0, tableWidgetItemYear);
            tableWidget.setItem(row, 1, tableWidgetItemСar);
            tableWidget.setItem(row, 2, tableWidgetItemСolor);
            tableWidget.setItem(row, 3, tableWidgetItem);
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
24.05.2016, 14:36  [ТС] 12
все исправила) все работает

Добавлено через 2 часа 14 минут
alexu_007, я теперь хочу сделать сохранение изменений в файл. НО, оно в моей функции не знает некоторых значений((
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void write( QFile file)
{
    QTextStream out(&file);
     for (int row = 1; row <= tableWidget.rowCount(); ++row)
     {
            for (int col = 0; col < 3; ++col)
            {
               out << tableWidget.item(row, col)->text();
                if (col != 2)
                    out << ",";
            }
     out << "\n";
     }
}
C++ (Qt)
1
2
3
4
5
int main(int argc, char *argv[])
{
 write();
    
}
0
alexu_007
154 / 168 / 35
Регистрация: 29.05.2015
Сообщений: 1,163
24.05.2016, 15:21 13
natalyPod, я уверен - оно знает всё. А мы не экстрасенсы и не знаем, что у вас там в таблице находится и что оно не хочет сбрасывать в файл.
0
mevn
137 / 106 / 23
Регистрация: 06.10.2008
Сообщений: 451
24.05.2016, 15:37 14
По моему, чтобы вызвать функцию
Цитата Сообщение от natalyPod Посмотреть сообщение
void write( QFile file)
недостаточно написать
Цитата Сообщение от natalyPod Посмотреть сообщение
write();
Наверно надо бы передать в нее переменную типа QFile, и по логике вещей открыть этот файл для чтения
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
24.05.2016, 16:06  [ТС] 15
mevn, это такое. в самой функции ошибки, а то что не передала аргумент, это мелочи жизни)
alexu_007, у меня в таблице если вы смотрели мой код который я скидываю время от времени названия машин, год выпуска и цвет. И я хочу после изменений в таблице например цвета, чтобы оно сохранялось(это изменение) в файл(перезаписало в файл). Не перекручуйте слова, я не писала что оно не хочет сбрасывать в файл , а писала что моя функция не знает некоторых перемен которые в меине у меня. Например: tableWidget.rowCount(); tableWidget.item(row, col)

Добавлено через 1 минуту
Цитата Сообщение от mevn Посмотреть сообщение
Наверно надо бы передать в нее переменную типа QFile, и по логике вещей открыть этот файл для чтения
по логике вещей я это делаю...
Код
 if (!file.open(QIODevice::ReadWrite))
 Комментарий модератора 
Для цитирования есть тег QUOTE. Тег CODE применяется для выделения кода, который невозможно выделить более конкретными тегами кода(к примеру CPPQT, JS и т.д.)
0
alexu_007
154 / 168 / 35
Регистрация: 29.05.2015
Сообщений: 1,163
24.05.2016, 18:59 16
Сделайте функцию write членом класса widget. Или сбрасывайте тексты из таблицы в в какой-нить список, и передавайте его в функцию как параметр.
0
natalyPod
11 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 95
25.05.2016, 13:05  [ТС] 17
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сделайте функцию write членом класса widge
У меня весь код в main, поэтому и проблемы. Если бы в хедере и в классе я делала, а не в меине, проблем не было. А так уже там сделала.

Добавлено через 16 часов 56 минут
Парни, я понимаю что я блондинка тупая, все спрашиваю, но парни, я не знаю как дальше.
Все что смогла сделала:
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
#include <QtWidgets>
void write(const QTableWidget* tableWidget, QFile* file)
{
    QTextStream out(file);
     for (int row = 0; row < tableWidget->rowCount(); ++row)
     {
            for (int col = 0; col < 3; ++col)
            {
               out << tableWidget->item(row, col)->text();
                if (col != 2)
                    out << ",";
            }
     out << "\n";
     }
}
int main(int argc, char *argv[])
{
 
    QApplication app(argc, argv);
    QTableWidget tableWidget(0,0);
 
    QFile file("D:/cars.txt");
    if (!file.open(QIODevice::ReadWrite))
    {
        QMessageBox::information(0, "error", file.errorString());
    }
 
    QTextStream textStream(&file);
 
    tableWidget.insertColumn(0);
    tableWidget.insertColumn(1);
    tableWidget.insertColumn(2);
 
    QStringList  stringList;
    stringList << "Year Released" << "Car" << "Color";
    tableWidget.setHorizontalHeaderLabels(stringList);
 
    while (!textStream.atEnd())
    {
        QString line = textStream.readLine();
        QStringList fields = line.split(",");
 
        const int row = tableWidget.rowCount();
        tableWidget.insertRow(row);
 
        for (int col = 0; col < 3; ++col)
        {
            QTableWidgetItem* tableWidgetItem = new QTableWidgetItem(QString("%1").arg(fields.at(col)));
            tableWidget.setItem(row, col, tableWidgetItem);
        }
    }
    file.open(QIODevice::ReadWrite);
    write(&tableWidget, &file);
    tableWidget.resize(330, 445);
    tableWidget.show();
 
    return app.exec();
}
В правильном направлении иду? Что подскажите сделать чтобы програма правильно работала: пересохраняла

Добавлено через 24 минуты
я так поняла мне нужно сигнал сделать, закрития программы и там вызывать функция write

Добавлено через 22 минуты
Как то так
C++ (Qt)
1
QObject::connect(tableWidget, SIGNAL(write(&tableWidget, &file)), SLOT (quit()));
0
25.05.2016, 13:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru