Hi,

I am new to C++ Qt5, hopefully I believe I have two issues to sort here, The tableview was working as expected with all the buttons functioning correctly, then I have tried to add QSortFilterProxyModel to the model to filter columns with lineedits, now clicking the buttons the program crashes, which leads me to find tha QSortFilterProxyModel is overriding the original source code, not sure how to get round this. that said the lineedits work, the other issue is that I am trying to have the filter work by one character at a time in the whole string of the column, eg. if I type a capital S in the system lineedit (column 1) I just want Steel to remain, and not include "600 Series" "Briton 2800 Series"
Could someone please point me in the right direction to sort these issues, code as below
thank you in advance.


Qt Code:
  1. #include "materials.h"
  2. #include "ui_materials.h"
  3.  
  4.  
  5. Materials::Materials(QWidget *parent)
  6. : QDialog(parent), ui(new Ui::Materials)
  7. {
  8. ui->setupUi(this);
  9.  
  10. ldb = QSqlDatabase::addDatabase("QSQLITE");
  11. ldb.setDatabaseName("/home/design/Desktop/Builder/Stock.db");
  12.  
  13. if(!ldb.open())
  14. {
  15. qDebug()<<("Failed To Open the Database");
  16. QMessageBox::critical(this, "Cannot open database","Unable to establish a database connection.\n\n"
  17. "Click Cancel to exit.",QMessageBox::Cancel);
  18. }
  19.  
  20. QSqlTableModel *model= new QSqlTableModel(this);
  21. model->setTable("materials");
  22. model->setEditStrategy(QSqlTableModel::OnManualSubmit);
  23. model->setHeaderData(0, Qt::Horizontal, tr("id"));
  24. model->setHeaderData(1, Qt::Horizontal, tr("System"));
  25. model->setHeaderData(2, Qt::Horizontal, tr("Part Number"));
  26. model->setHeaderData(3, Qt::Horizontal, tr("Product"));
  27. model->setHeaderData(4, Qt::Horizontal, tr("Finish"));
  28. model->setHeaderData(5, Qt::Horizontal, tr("Cost"));
  29. model->setHeaderData(6, Qt::Horizontal, tr("Qty."));
  30. model->setHeaderData(7, Qt::Horizontal, tr("Supplier"));
  31. model->select();
  32.  
  33. while(model->canFetchMore())
  34. {
  35. model->fetchMore();
  36. }
  37. qDebug() <<(model->rowCount());
  38. ui->lineEditCount->setText(QString::number(model->rowCount()));
  39.  
  40. QSortFilterProxyModel *systemFilter = new QSortFilterProxyModel(model);
  41. systemFilter->setSourceModel(model);
  42. systemFilter->setFilterKeyColumn(1);
  43.  
  44. QSortFilterProxyModel *partNumberFilter = new QSortFilterProxyModel(model);
  45. partNumberFilter->setSourceModel(systemFilter);
  46. partNumberFilter->setFilterKeyColumn(2);
  47.  
  48. QSortFilterProxyModel *productFilter = new QSortFilterProxyModel(model);
  49. productFilter->setSourceModel(partNumberFilter);
  50. productFilter->setFilterKeyColumn(3);
  51.  
  52. QSortFilterProxyModel *supplierFilter = new QSortFilterProxyModel(model);
  53. supplierFilter->setSourceModel(productFilter);
  54. supplierFilter->setFilterKeyColumn(7);
  55.  
  56. QTableView *tableView = ui->tableView;
  57. tableView->setModel(supplierFilter);
  58. tableView->setSortingEnabled(true);
  59. tableView->setColumnHidden(0,true);
  60. tableView->horizontalHeader()->setFixedHeight(20);
  61. tableView->horizontalHeader()->setFont(QFont("Arial"));
  62. tableView->horizontalHeader()->setStyleSheet("QHeaderView {font-weight: bold; font-size: 10pt; color: #000;} ");
  63. tableView->sortByColumn(1,Qt::AscendingOrder);
  64. tableView->resizeColumnsToContents();
  65.  
  66.  
  67. connect(ui->lineEditSystem, SIGNAL(textEdited(QString)), systemFilter, SLOT(setFilterRegExp(QString)));
  68. connect(ui->lineEditPartNumber, SIGNAL(textEdited(QString)), partNumberFilter, SLOT(setFilterRegExp(QString)));
  69. connect(ui->lineEditProduct, SIGNAL(textEdited(QString)), productFilter, SLOT(setFilterRegExp(QString)));
  70. connect(ui->lineEditSupplier, SIGNAL(textEdited(QString)), supplierFilter, SLOT(setFilterRegExp(QString)));
  71. }
  72.  
  73. Materials::~Materials()
  74. {
  75. delete ui;
  76. }
  77.  
  78. void Materials::on_addRecordButton_clicked()
  79. {
  80. const int row = model->rowCount();
  81. model->insertRows(row, 1);
  82. ui->tableView->scrollToBottom();
  83. }
  84.  
  85. void Materials::on_updateRecordButton_clicked()
  86. {
  87. model->submitAll();
  88. while(model->canFetchMore())
  89. {
  90. model->fetchMore();
  91. }
  92. }
  93.  
  94. void Materials::on_cancelChangesButton_clicked()
  95. {
  96. model->revertAll();
  97. ui->tableView->scrollToTop();
  98. }
  99.  
  100. void Materials::on_deleteRecordButton_clicked()
  101. {
  102. QMessageBox msgBox;
  103. msgBox.setIconPixmap(QPixmap(":/images/icon.png"));
  104. msgBox.setWindowTitle("Delete Record - Warning");
  105. msgBox.setText("Do not press the Delete button until you\n"
  106. "have highlighted the row you wish to Delete.\n\n"
  107. "Do You Really Want To Delete This Record?");
  108. QPushButton *deleteButton = msgBox.addButton(tr("Delete"), QMessageBox::ActionRole);
  109. deleteButton->setStyleSheet("QPushButton:hover{background-color:#FFCCCC;border:1px solid #000;color:#000;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}");
  110. deleteButton->setFocusPolicy(Qt::NoFocus);
  111. deleteButton->setMinimumWidth(100);
  112. deleteButton->setMaximumHeight(23);
  113. QPushButton *cancelButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
  114. cancelButton->setStyleSheet("QPushButton:hover{background-color:#E0FFFF;border:1px solid #000;color:#000;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}");
  115. cancelButton->setFocusPolicy(Qt::NoFocus);
  116. cancelButton->setMinimumWidth(100);
  117. cancelButton->setMaximumHeight(23);
  118. msgBox.exec();
  119. if (msgBox.clickedButton() == deleteButton)
  120. {
  121. model->removeRow(ui->tableView->currentIndex().row());
  122. model->submitAll();
  123. }else if (msgBox.clickedButton() == cancelButton)
  124. {
  125. }
  126. }
  127.  
  128. //void Materials::on_informationButton_clicked()
  129. //{
  130. // InfoDialog * dialog = new InfoDialog(this);
  131.  
  132. // dialog->exec();
  133. //}
  134.  
  135. void Materials::on_exitButton_clicked()
  136. {
  137. this->close();
  138. }
To copy to clipboard, switch view to plain text mode 


materials.jpg