Я знаю, как форматировать функции в C ++ по большей части, за исключением этого сценария, который я никогда раньше не видел.
В настоящее время у меня есть это:
void MainWindow::on_viewEmployees_clicked()
{
QDebug debugTxt(QtDebugMsg);
DatabaseControl myDBControl; //this is the header file that I want to use
QSqlQuery qry;
bool ok;
int rows = myDBControl.getNumEmployees();
ui->table->setRowCount(rows);
int count = 0;
int currentCol = 0;
while(count < rows){
qry.prepare("SELECT * FROM employees ORDER BY lastname LIMIT :f1, :f2");
qry.bindValue(":f1", count);
qry.bindValue(":f2", count+1);
qry.exec();
qry.next();
currentCol = 0;
while(currentCol < ui->table->columnCount()){
QTableWidgetItem *setdes = new QTableWidgetItem;
setdes->setText(qry.value(currentCol).toString());
ui->table->setItem(count, currentCol-1, setdes);
currentCol++;
}
count++;
}
debugTxt << "Table successfully populated";
ui->lblResult->setText("[+] Table successfully populated");
}
который компилируется нормально и все, конечно. Он делает именно то, что должен — сканировать содержимое базы данных SQLite и выводить его через QTableWidget, упорядоченный по фамилии сотрудника, всякий раз, когда вы нажимаете кнопку «viewEmployees». Без вопросов.
Однако я хочу преобразовать это в функцию … скажем, DatabaseControl.refreshTableView ().
Я скопировал / вставил это в класс DatabaseControl, и я знаю, чтобы изменить все ссылки на DatabaseControl на «this», однако я не знаю, что делать с битами «ui->», поскольку ui-> что-то в мой mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
В результате я не могу изменить ни один из элементов пользовательского интерфейса в MainWindow (насколько я знаю). Что я хочу сделать, так это иметь возможность редактировать эти элементы интерфейса через класс DatabaseControl. Более конкретно, я хочу редактировать содержимое этого QTableWidget через DatabaseControl.
Вы можете написать публичные функции для MainWindow
класс, к которому можно получить доступ из вашего класса DataControl, который будет изменять элементы пользовательского интерфейса.
Редактировать: Или вы могли бы написать функцию в MainWindow
это вернет указатель на переменную пользовательского интерфейса и изменит пользовательский интерфейс оттуда.
как это:
MainWindow::getUI(){ return ui} // if your ui variable is already stored as a pointer
и теперь вы можете позвонить MainWindow::getUI()
функция из класса DataControler и манипулировать вашим пользовательским интерфейсом
Что ж, чтобы ответить на ваш вопрос напрямую, можно было бы передать объект ui-> table в ваш метод refreshTableView (). Или как-то предоставить доступ к MainWindow вашему объекту DatabaseControl (например, как предлагает redshark).
Однако я подозреваю, что это не очень хороший способ структурировать код. Многие приложения пытаются отделить базу данных от представления информации в базе данных. Одна из причин заключается в том, что если вы хотите изменить способ представления ваших данных, они не должны зависеть от способа извлечения информации из базы данных. Точно так же вы не хотите нарушать код презентации, если вам нужно переключиться на новую базу данных с другим API и т. Д.
Об этом можно сказать намного больше, но, надеюсь, этого достаточно, чтобы вы подумали о том, что было хорошо пройдено и доказано.