Ошибка C ++ / Qt Threads без использования потоков

Я использую специальную форму фреймворка qt, и это будет выглядеть немного сложнее. Но не беспокойся. Это так же, как оригинальная структура QT. (И нет, я не могу это изменить)

Мое намерение этой программы состоит в том, чтобы загрузить таблицу в tableview от пользовательского интерфейса. tableview должно иметь столько строк и текста, сколько файлов в каталоге. Я беру все файлы в каталоге и ставлю на них фильтр. Только выбранный считается и используется впоследствии.

А теперь к моей проблеме:
Я хочу отобразить таблицу как таблицу Excel: она должна выделять ячейку, в которой находится мой курсор (в моем примере это счетчик, который идет вверх и вниз) (сейчас у меня нет курсора, поэтому я должен использовать самостоятельно созданный «курсор». Вы увидите это в программе, что я имею в виду).
Я использую QStandardItemModel чтобы отобразить его и QStandardItem определить это.
Потому что я хочу изменить цвет ячеек, которые я использую QStandardItem массив для сохранения ячеек по одной.

form.h:

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QTextTable>
#include <QFont>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QString>
#include <QStringList>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QBrush>namespace Ui {
class Form;
}

class Form : public QWidget
{
Q_OBJECT

public:
explicit Form(QWidget *parent = 0);
~Form();

void my_setCFGFromDirectory();
void my_Highlighted(int, bool);
void my_loadCFG(int);private:
Ui::Form *ui;

QFile file;
QTextStream textstream;
QDir directory;
QString filename;
QStringList stringlist;
QStringList filter;
QStandardItemModel *model;
QStandardItem *tableitem;
QStandardItem* pointerTableitem[];

int max_files;
int w_counter;
bool check1;
bool check2;
bool check3;
};

#endif // FORM_H

и
form.cpp

#include "form.h"#include "ui_form.h"#include "rbobject.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}

Form::~Form()
{
delete ui;
}

void Form::my_Highlighted(int actual_count, bool modus){
if(modus == 1){
w_counter = 0;
while(w_counter < max_files){
if(w_counter == actual_count){
pointerTableitem[w_counter]->setBackground(QBrush(QColor(130,180,255)));
}
w_counter++;
}
}
else
{
w_counter = 0;
while(w_counter < max_files){
pointerTableitem[w_counter]->setBackground(QBrush(QColor(255,255,255)));
w_counter++;
}
}
}void Form::my_setCFGFromDirectory(){
directory.setPath("/etc/rosenbauer/CFG-Files");
filter << "*_CFG.ini";
stringlist = directory.entryList(filter);      //takes the selected files and wriths them in a filelist
max_files = stringlist.count();               //Counts the selected files
pointerTableitem [max_files];
memset(pointerTableitem, 0, max_files*sizeof(int)); //The compiler can not see how many elements should be in the array at the time he constructs the array.
//So you have to use this to tell the compiler, how many elements it should create

model = new QStandardItemModel(max_files, 1, this);             //Rows , Columns , this
model->setHorizontalHeaderItem(0, new QStandardItem(QString("CFG-Files"))); //Column , QStandarditem...name

for(w_counter = 0; w_counter != max_files; w_counter++){
tableitem = new QStandardItem();
tableitem->setBackground(QBrush(QColor(255,255,255)));
tableitem->setText(QString(stringlist[w_counter]));     //Wriths text in the cell
qDebug() << tableitem->text();

pointerTableitem[w_counter] = tableitem;    //Stacks the tableitems in a filelist
model->setItem(w_counter, 0, tableitem);    //Row, Column , tableitem...text
}
w_counter = 0;

//pointerTableitem[2]->setBackground(QBrush(QColor(130,180,255))); //Test

ui->TableConfig->setModel(model);   //Sets the table into the UI
}void Form::my_loadCFG(int file_position){check1 = 0;
check2 = 0;

directory.setPath("/etc/rosenbauer/etc/rosenbauer");
check1 = directory.remove("SA008_890560-001_CFG.ini");
check2 = directory.remove("reparsed/SA008_890560-001_CFG.ini_reparsed");

if(check1 && check2){
filename = pointerTableitem[file_position]->text();
check3 = QFile::copy("/etc/rosenbauer/CFG-Files/"+filename, "/etc/rosenbauer/SA008_890560-001_CFG.ini");

if(!check3){
qDebug() << "Error! Could not copy new CFG-file into directory";
}
}
else
{
qDebug() << "Error! Could not delete running CFG-file(s) from directory";
}}

Основной заголовок rbobject45000.h

#ifndef RbObject45000_H
#define RbObject45000_H

#include "rbobject.h"#include "form.h"class RbObject45000 : public RbObject{public:
RbObject45000();
RbObject45000(qint32 rbObjectId, RDataObject *dataobject, qint32 style, QObject *parent = 0);
RbObject45000(qint32 rbObjectId, qint32 style, qint32 prio, QObject *parent);

bool entered_ui;
bool entered_key;
short counter;

short w_count;
short delay_count;

short max_files;
short begin;
short end;

Form *f;void exec();

~RbObject45000();
};

#endif // RbObject45000_H

И это главное:
rbobject45000.cpp

RbObject45000::RbObject45000(qint32 rbObjectId, qint32 style, qint32 prio, QObject *parent):
RbObject(rbObjectId, style, prio, parent){

entered_ui = 0;
entered_key = 0;

counter = 0;
w_count = 1; //... whilecounter
delay_count = 0; //... delay for the deadtime

max_files = 0;
begin = 0;
end = 0;

f= new Form(); //f...name of the displayed UI
}void RbObject45000::exec(){

//Opens the file on the display
if(getKey(RB_KEY_9) && getKey(RB_KEY_7) && entered_ui ==0){
f->show();
entered_ui = 1;// Geting the Files from Directory
f->my_setCFGFromDirectory();
}// Prescind them file in the table
if(entered_ui == 1 && delay_count == 2){

if(getKey(RB_KEY_7)){
counter--;
entered_key = 1;
if(counter < 0){
counter = 0;
}
}
else if(getKey(RB_KEY_9)){
counter++;
entered_key = 1;
if(counter > max_files){
counter = max_files;
}
}if(entered_key == 1){
while(w_count <= max_files){
f->my_Highlighted(w_count, 0); //Cell , not highlighted
w_count++;
}
w_count = 0;
f->my_Highlighted(counter,1);  //Cell , highlighted
entered_key = 0;
}
delay_count = 0;

}
else if(delay_count == 2){  //if delay == 2 and nobody hit a button
delay_count = 0;
}
delay_count++;//Load the coosen file as programm-config in
if(entered_ui == 1){
if(getKey(RB_KEY_8)){
f->my_loadCFG(counter);
}
}

}

(RB_KEY_7-9 — кнопки аппаратного модуля, нужно только нажать на них)
Так что, если я сделаю это так, программа скомпилируется и запустится. Если я нажимаю кнопки и программа запускается в my_setCFGFromDirectory() он выходит из окна и останавливается, но если QStandardItem pointerTableitem объявлен в my_setCFGFromDirectory() все работает нормально (но pointerTableitem должно быть private).

Я получаю следующие ошибки:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is Form(0x167498), parent's thread is QThread(0x1414e8), current thread is QThread(0x15d2d8)
Segmentation fault

Похоже, что я использую тему (я уверен, что я не использую). Но я знаю, что это как-то связано с pointerTableitem и объявление в шапке и cpp.

0

Решение

Если я не ошибаюсь, проблема заключается здесь:

model = new QStandardItemModel(max_files, 1, this);

Вы пытаетесь создать QStandardItemModel передавая ваш Form пример this как родитель, форма была создана в главном потоке, этот вызов, по-видимому, происходит в другом потоке (внесенных вами изменений было недостаточно, все еще неясно, RbObject наследуется QThread но вы можете проверить это сами) и, следовательно, сообщение об ошибке.

Почему бы не вызвать функцию в главном потоке? Вместо этого

f->show();
entered_ui = 1;

// Geting the Files from Directory
f->my_setCFGFromDirectory();

в другом потоке создайте пару слот / сигнал для Form класс, поместите этот код в слот и запустить подключенный сигнал от RbObject45000::exec(), Неправильно выполнять манипуляции с пользовательским интерфейсом из стороннего интерфейса.

0

Другие решения


По вопросам рекламы [email protected]