Russian Qt Forum
Апрель 29, 2024, 09:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Базы данных / QSqlTableModel не добавляет данные если переопределить flags : Февраль 04, 2024, 20:54
Доброго времени суток.
Специально написал тестовую прогу чтобы найти причину.
https://disk.yandex.ru/d/CI2NohoT0Ps7Ww
Вообщем в чем суть добавляю в базу данные используя 
Код:
class Abonent_Model : public QSqlTableModel
Код:
bool Abonent_Model::add_model_abonent(const QString &nick_name, const QByteArray & hash, const QString & avatar)
{

    //qDebug() <<  "m_model->tableName() = " << m_model->tableName();
   // m_qdb.transaction();
    QSqlRecord record = this->record();
   // record.clear();


    record.setValue("nick_name", nick_name);
    record.setValue("hash_abonent", hash);
    record.setValue("last_date_time", QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm"));
    record.setValue("avatar", avatar);

    if(this->insertRecord(-1, record)) //add to model
    {
        if (!this->submitAll()) //add to base_data
        {
            qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
            qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
            this->revertAll();
            return false;
        }

        return true;
    }
    else //TODO db & rollback
    {
        qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
        qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
        this->database().rollback();
    }
    return false;
}

И submitAll выдает ошибку мол не чего добавлять в базу. (Error model line:  33 "No Fields to update")

Теперь заремим переопределенный метод и его реализацию 
Код:
protected:
    Qt::ItemFlags flags(const QModelIndex &index) const;

//Qt::ItemFlags Abonent_Model::flags(const QModelIndex &index) const
//{
//    if(!index.isValid())
//        return Qt::ItemIsEnabled;
//    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
//}

и теперь все прекрасно добавляется, это походу баг QSqlTableModel, так как эти flags связаны с представлением , а не с базой. Может кто сталкивался гляньте ?
Конечно можно добавить через
Код:
QSqlQuery query(m_qdb);
    ok = query.exec("insert into abonents values('nick1', '111111111', '2.02.2024 02:01', '')");
    if(!ok)
    {
        qDebug() << __LINE__ << "query.exec" << query.lastError().text();
    }
Но это так не устраивает , тогда лучше использовать libsqlite  и свою модель от QAbstractItemModel , а не это вот все
2  Qt / Пользовательский интерфейс (GUI) / Re: QTableView стиль выделения : Апрель 14, 2023, 17:10
Это можно сделать только в делегате
Стиль настраивать для такого бесполезно
3  Qt / Пользовательский интерфейс (GUI) / QTreeView как сделать чтобы текст был по середине Widgeta : Апрель 13, 2023, 21:49
Доброго времени суток.

Небольшой пример.
Код:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
    ui->setupUi(this);
    QDirModel *model = new QDirModel(this);
    ui->treeView->setModel(model) ;
    ui->treeView->setMaximumWidth(200);
    ui->treeView->hideColumn(1);
    ui->treeView->hideColumn(2);
    ui->treeView->hideColumn(3);
    ui->treeView->hideColumn(4);
   
    m_RootIndex = model->index("/home/user");
    ui->treeView->setRootIndex(m_RootIndex);

    connect(ui->treeView, SIGNAL(expanded(const QModelIndex &)), this, SLOT(on_tree_widget_expanded(const QModelIndex &)));
    connect(ui->treeView, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(on_tree_widget_collapsed(const QModelIndex &)));
}
///пройдемся по parent  найдем m_RootIndex
int MainWindow::depth_branch(const QModelIndex &index)
{
    int ret = 0;
    QModelIndex in = index;
    while (in != m_RootIndex)
    {
        in = in.parent();
        ret++;
    }
    return ret;
}

void MainWindow::on_tree_widget_expanded(const QModelIndex &index)
{
    ui->treeView->resizeColumnToContents(0);

    int value = ui->treeView->horizontalScrollBar()->value();
    qDebug() << value;
    ui->treeView->horizontalScrollBar()->setValue(value + depth_branch(index)*10);
    m_value = ui->treeView->horizontalScrollBar()->value();

}

void MainWindow::on_tree_widget_collapsed(const QModelIndex &index)
{
    ui->treeView->resizeColumnToContents(0);

    int value = ui->treeView->horizontalScrollBar()->value();

    ui->treeView->horizontalScrollBar()->setValue(value - depth_branch(index)*10);
    m_value = ui->treeView->horizontalScrollBar()->value();

}
и
Когда user  переходит по каталогам (стрелка вправо ) с большой вложенностью размера ширины  treeview  не хватает чтобы показать имя директории, надо как то заставить горизонтальный scroll подвинуться и сдвинуться обратно когда нажата стрелка вправо (вышли из ветки)

Когда переходим по веткам текст current item-а должен быть по середине widgeta пытаюсь в данном примере, управлять горизонтальным scrollbar,
но когда пользователь переходит на стрелке вниз значение scrollBar->value изменяется на ноль, Подскажите как сделать правильно?
4  Qt / Многопоточное программирование, процессы / Qthread and QTimer : Июль 30, 2022, 17:09
Здравствуйте.
Пишу поиск файлов.
Соответственно сам поиск происходит в потоке, общая задумка такая, чтобы не мигало ui->listView (model = m_ptr_model_file_result_find ) при добавление 1 item-a накапливаем промежуточный mResultFiles и потом по таймеру вызываем слот slot_result_info_search, где добавляем в модель m_ptr_model_file_result_find  наши данные.
Но так как m_ptr_search_files и ptr_timer находятся в одном потоке, то пока работает m_ptr_search_files , слот timeout() от ptr_timer не сработает (m_ptr_search_files - забьет все время работы  потока). Как написать правильно ?

Код:
 m_ptr_search_files = new SearchFiles(ui->combo_dir_find->currentText(), get_param_search());
QThread *ptr_thread = new QThread(this);
QTimer *ptr_timer;
ptr_timer = new QTimer(0);
ptr_timer->setInterval(100);
ptr_timer->moveToThread(ptr_thread);
m_ptr_search_files->moveToThread(ptr_thread);
m_ptr_search_files->connect(ptr_timer, SIGNAL(timeout()), SLOT(slot_timer_result()), Qt::DirectConnection);
ptr_timer->connect(ptr_thread, SIGNAL(started()), SLOT(start()));
connect(ptr_thread, SIGNAL(started()), m_ptr_search_files, SLOT(slot_search()));
connect(m_ptr_search_files, SIGNAL(sig_result_info(const QStringList &)),  this, SLOT(slot_result_info_search(const QStringList &)));

///добавляем найденный путь в промежуточный буффер mResultFiles
void SearchFiles::add_result(const QString &path)
{
    mMutex.lock();
    mResultFiles << path;   
    mMutex.unlock();
}



void SearchFiles::slot_timer_result()
{
    qDebug() << "SearchFiles slot_timer_result" << mResultFiles.count();
    if(mResultFiles.isEmpty())
        return;

    mMutex.lock();
    emit sig_result_info(mResultFiles);
    mResultFiles.clear();
    mMutex.unlock();
}
void SearchFiles::slot_search(const QString &dir)
{
    if(m_is_stop)
        return;


    QDirIterator iterator (dir, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::System/* QDirIterator::Subdirectories*/);
    while(iterator.hasNext())
    {
        iterator.next();
        if(m_is_pause)
             mSema.acquire();
        if(m_is_stop)
            return;

        QFileInfo fi = iterator.fileInfo();
        if(filter_files(fi))
        {

            add_result(fi.filePath());
        }

        if(fi.isDir() && mParamSearch.at(1).toBool()) //рекурсивный поиск
        {

            slot_search(fi.filePath());
        }
    }
}

///слот старта потока
void SearchFiles::slot_search()
{
    mResultFiles.clear();
    QDir d(mDir);
    if(d.exists(mDir))
    {
        slot_search(mDir);
    }

    slot_timer_result();//сбросим что осталось
    emit finished();
}

//получение результатов от поиска
void MainWindow::slot_result_info_search(const QStringList &list)
{
    //добавляем новый item


    QList<QStandardItem *> items_list;


    QStandardItem *root =  m_ptr_model_file_result_find->invisibleRootItem();

    foreach(QString path, list)
    {
       
        items_list.append(new QStandardItem(m_ptr_model_file->findIcon(path), path));
    }

    root->appendRows(items_list);
   

    qDebug() << "m_ptr_model_file_result_find->rowCount() =  " << m_ptr_model_file_result_find->rowCount();

    ui->label_count_files->setText(QString::number(m_ptr_model_file_result_find->rowCount()));

    qDebug() << "--------------- ";   
}

5  Qt / Многопоточное программирование, процессы / Помогите с архитекрурой многопоточного приложения : Март 18, 2022, 01:42
Доброго времени суток .
Помогите с архитектурой, как такое написать в Qt
схема


https://disk.yandex.ru/i/nFBdcgQzmE_2ig


Есть устройство открыли читаем thread_read
Есть поток для записи thread_write там add_to QList<MyItem>
Они должны взаимодействовать, как то обменяться данными. Запись от thread_write прошла или нет. Через что пока только мысль по указателю на объект так как SIGNAL SLOT к разным потокам нельзя имхо

thread_read  должен общаться с потоком обработки thread_make там тоже список на обработку add_to QList<MyItem>
thread_make должен иметь доступ к thread_write add_to QList<MyItem>
gui должен иметь доступ к thread_write add_to QList<MyItem>
gui должен иметь доступ к thread_make add_to QList<MyItem>
thread_read должен иметь доступ к gui

Помогите спроектировать ??
У меня уже желание сделать один объект и несколько потоков, а с GUI через сокет или еще что то
Код:
static void *func_read_device(void* arg)
{
    my_make * ptr_my_make = (my_make*)arg;
    ptr_my_make->read_device();
    pthread_exit(nullptr);
}

my_make::creat_thread()
{
int result = pthread_create(&m_read_thread, &attr_pthread, func_read_device, this);
 }
6  Qt / Пользовательский интерфейс (GUI) / хочу сделать типо такого - QImage (ил другой объект) заполняется из потока : Июнь 18, 2020, 18:49
Доброго времени суток.
Есть поток QThread, он заполняет массив unsigned char* m_data;
из этого потока есть сигнал  emit sig_update_image(m_data); который передаст указатель слоту для отрисовки изображения
Далее слот update_image отображает картинку
Код:
void view::update_image(unsigned char *data)
{
   QImage image(data,w,h,byte_per_line, format);


   QPixmap pixmap->fromImage(image)
   m_pixmap->scaled(imageLabel->width(), imageLabel->height());

   ui->label->setPixmap(m_pixmap);
}

Получается слишком много перекладывания данных (данных может быть очень много не сжатое изображение ) Вызовов update_image тоже много.
Как сделать чтобы был один объект для отображения, а данные закачивать в него когда захочу?
Страниц: [1]

Страница сгенерирована за 0.052 секунд. Запросов: 24.