LINUX.ORG.RU

Проблема с символами в qtablewidget?

 ,


0

1

3аполняю таблицу 3начениями, ра3 от ра3у часть английских слов вводится, а сейчас как на картинке

#pragma once

#include <ctime>
#include <cstring>
#pragma warning(disable : 4996)
class Task
{
public:
  int id;
  char* task;
  int parentTask;
  char* executor;
  int idExecutor;
  tm* dateStart;
  tm* dateDeathLine;
  char* status;
  char* oldtask;
  Task();
  void AddTask(char* task_, int parentTask_, char* executor_,
    int idExecutor_, tm* dateDeathLine_);
  void DeleteTask(int num);
  ~Task();
};
#include "Task.h"

Task::Task()
{
  task = new char[1024];
  executor = new char[256];
  status = new char[64];
  oldtask = new char[2048];
  dateDeathLine = new tm();
  dateStart = new tm();
};


vector<vector<string>> v;
    vector<string> tmp;
    char* date_string = new char[50];
    for (int i = 0; i < db.vTask.size(); i++)
    {
        tmp.push_back(to_string(db.vTask[i].id));
        tmp.push_back(db.vTask[i].task);
        tmp.push_back(to_string(db.vTask[i].parentTask));
        tmp.push_back(db.vTask[i].executor);
        strftime(date_string, 50, " %Y-%m-%d", db.vTask[i].dateDeathLine);
        tmp.push_back(date_string);
        strftime(date_string, 50, "%Y-%m-%d", db.vTask[i].dateStart);
        tmp.push_back(date_string);
        tmp.push_back(db.vTask[i].status);
        tmp.push_back(db.vTask[i].oldtask);
        v.push_back(tmp);
        tmp.clear();
    }
    for(int i=0;i<db.numRow;i++)
        for (int j = 0; j < db.numCol; j++)
        {
            qstr = QString::fromStdString(v[i][j]);
            table.setItem(i, j, new QTableWidgetItem(qstr));
        
        }
https://ibb.co/vJPx3qs

Тупанул надо было копировать строки, а не присваивать

 Task* task_ = new Task();
    for (int i = 0; i < nrows; i++)
    {
        task_->id = atoi(PQgetvalue(res, i, 0));
        strcpy(task_->task , PQgetvalue(res, i, 1));
        task_->parentTask = atoi(PQgetvalue(res, i, 2));
        strcpy(task_->executor , PQgetvalue(res, i, 3));
        char* ddl = PQgetvalue(res, i, 4);
        ddl[4] = ddl[7] = '\0';
        task_->dateDeathLine->tm_year = atoi(&ddl[0]) - 1900;
        task_->dateDeathLine->tm_mon = atoi(&ddl[5]) - 1;
        task_->dateDeathLine->tm_mday = atoi(&ddl[8]);
        ddl = PQgetvalue(res, i, 5);
        ddl[4] = ddl[7] = '\0';
        task_->dateStart->tm_year = atoi(&ddl[0]) - 1900;
        task_->dateStart->tm_mon = atoi(&ddl[5]) - 1;
        task_->dateStart->tm_mday = atoi(&ddl[8]);
        strcpy(task_->status , PQgetvalue(res, i, 6));

        strcpy(task_->oldtask , PQgetvalue(res, i, 7));
        cout << " Id: " << task_->id;
        cout << " Task: " << task_->task;
        cout << " Parent: " << task_->parentTask;
        cout << " Executor: " << task_->executor;

        char* date_string = new char[50];
        strftime(date_string, 50, " %Y-%m-%d", task_->dateDeathLine);
        cout << " DeathLine: " << date_string;

        strftime(date_string, 50, "%Y-%m-%d", task_->dateStart);
        cout << " Start: " << date_string;
        cout << " Status: " << task_->status;
        cout << " Oldtask: " << task_->oldtask << endl;
        vTask.push_back(task_);
    }

bad_master
() автор топика
Task::Task()
{
  task = new char[1024];
  executor = new char[256];
  status = new char[64];
  oldtask = new char[2048];
  dateDeathLine = new tm();
  dateStart = new tm();
};

Может не надо?

pathfinder ★★★★
()
Ответ на: комментарий от bad_master

а щось цэ таки?

Можно task,executor,status,oldtask в std::string переделать. А dateDeathLine, dateStart вместо указателя на struct tm само значение struct tm.

За выделенной памятью следить надо. Такой код режет глаза.

pathfinder ★★★★
()

Вангую, что проблема с символами идёт от fromStdString. По документации, она предполагает, что на входе у неё UTF8.

У тебя вообще в проекте есть серьёзный резон мешать кутешные и не-кутешные строки? Не то, чтобы так было нельзя, но при этом надо следить за кодировками, кодеками и др. QString рассчитан на работу с юникодом. Соответственно, его лучше использовать по всему проекту, за исключением явных случаев чтения текста из файлов, сетевых потоков и других мест, где возможны сюрпризы (и локализовывать эти сюрпризы лучше именно там, где чтение происходит).

То, что у тебя в одном классе перемешан GUI (QTableWidget) и работа с каким-то не-кутешным поставщиком данных, это уже похоже на архитектурный косяк, хотя не видя всего кода, сказать трудно.

Аналогично с датой-временем. strftime - функция из C (даже не C++). У Qt есть классы по работе с датой и временем, там свои методы форматирования. Похоже на код человека, который пытается использовать Qt как «библиотеку для GUI», хотя на самом деле это модульный фреймворк.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.