Просмотр сообщений
|
Страниц: [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 , а не это вот все
|
|
|
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 тоже много. Как сделать чтобы был один объект для отображения, а данные закачивать в него когда захочу?
|
|
|
|
|