Changeset 15 in tspsg-svn for trunk/src


Ignore:
Timestamp:
Nov 5, 2007, 1:32:40 AM (17 years ago)
Author:
laleppa
Message:

Finished converting to Qt's model/view architecture

Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/mainwindow.cpp

    r13 r15  
    3838        // TODO: Loading of saved window state
    3939QRect rect = geometry();
    40     rect.moveCenter(QApplication::desktop()->screenGeometry(QApplication::desktop()->primaryScreen()).center());
     40        rect.moveCenter(QApplication::desktop()->screenGeometry(QApplication::desktop()->primaryScreen()).center());
    4141        setGeometry(rect);
    4242        qsrand(QDateTime().currentDateTime().toTime_t());
    43         PrepareTable();
    44 }
    45 
    46 int MainWindow::rand(int min, int max)
    47 {
    48         return min + (int)(((float)qrand() / RAND_MAX) * max);
    49 }
    50 
    51 void MainWindow::PrepareTable()
    52 {
    53 QTableWidgetItem *item;
    54         for (int y = 0; y < spinCities->value(); y++) {
    55                 item = new QTableWidgetItem(trUtf8("Город ") + QVariant(y + 1).toString());
    56                 tableTask->setVerticalHeaderItem(y,item);
    57                 item = new QTableWidgetItem(trUtf8("Город ") + QVariant(y + 1).toString());
    58                 tableTask->setHorizontalHeaderItem(y,item);
    59                 for (int x = 0; x < spinCities->value(); x++) {
    60                         if (y == x) {
    61                                 item = new QTableWidgetItem("...");
    62                                 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
    63                         } else {
    64                                 item = new QTableWidgetItem(QVariant(rand(randMin,randMax)).toString());
    65 QFont font = item->font();
    66                                 font.setBold(true);
    67                                 item->setFont(font);
    68                         }
    69                         item->setTextAlignment(Qt::AlignCenter);
    70                         tableTask->setItem(x,y,item);
    71                 }
    72         }
    73         tableTask->resizeRowsToContents();
    74         tableTask->resizeColumnsToContents();
     43        tspmodel = new CTSPModel();
     44        tspmodel->randMin = randMin;
     45        tspmodel->randMax = randMax;
     46        tspmodel->setNumCities(spinCities->value());
     47        taskView->setModel(tspmodel);
    7548}
    7649
    7750void MainWindow::CitiesNumberChanged(int n)
    7851{
    79 bool increased = tableTask->rowCount() < n ? true : false;
    80         tableTask->setRowCount(n);
    81         tableTask->setColumnCount(n);
    82         for (int k = 0; k < n; k++)
    83 //              tableTask->setColumnWidth(k,tableTask->viewport()->width() / n);
    84         // If number of cities increased we need to reset headers and set
    85         // appropriate sizes for new column and row
    86         if (increased) {
    87 QTableWidgetItem *item = new QTableWidgetItem(trUtf8("Город ") + QVariant(n).toString());
    88                 tableTask->setVerticalHeaderItem(n - 1,item);
    89                 item = new QTableWidgetItem(trUtf8("Город ") + QVariant(n).toString());
    90                 tableTask->setHorizontalHeaderItem(n - 1,item);
    91                 tableTask->resizeRowToContents(n - 1);
    92                 tableTask->resizeColumnToContents(n - 1);
    93                 item = new QTableWidgetItem("...");
    94                 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
    95                 tableTask->setItem(spinCities->value() - 1,spinCities->value() - 1,item);
    96                 for (int k = 0; k < spinCities->value() - 1; k++) {
    97                         item = new QTableWidgetItem(QVariant(rand(randMin, randMax)).toString());
    98 QFont font = item->font();
    99                         font.setBold(true);
    100                         item->setFont(font);
    101                         tableTask->setItem(k,spinCities->value() - 1,item);
    102                         item = new QTableWidgetItem(QVariant(rand(randMin, randMax)).toString());
    103                         font = item->font();
    104                         font.setBold(true);
    105                         item->setFont(font);
    106                         tableTask->setItem(spinCities->value() - 1,k,item);
    107                 }
    108         }
     52        tspmodel->setNumCities(n);
    10953}
    11054
     
    12266void MainWindow::Random()
    12367{
    124         for (int y = 0; y < spinCities->value(); y++)
    125                 for (int x = 0; x < spinCities->value(); x++)
    126                         if (x != y)
    127                                 tableTask->item(x,y)->setText(QVariant(rand(randMin, randMax)).toString());
     68        tspmodel->randomize();
    12869}
    12970
     
    13374tMatrix matrix;
    13475double *row;
     76int n = spinCities->value();
    13577bool ok;
    136         for (int x = 0; x < spinCities->value(); x++) {
    137                 row = new double[spinCities->value()];
    138                 for (int y = 0; y < spinCities->value(); y++) {
    139                         if (x == y)
    140                                 row[y] = infinity;
    141                         else {
    142                                 row[y] = tableTask->item(x,y)->text().toDouble(&ok);
    143                                 if (!ok) {
    144                                         QMessageBox(QMessageBox::Critical,trUtf8("Ошибка в данных"),QString(trUtf8("Ошибка в ячейке [Строка %1; Колонка %2]: Неверный формат данных.")).arg(x + 1).arg(y + 1),QMessageBox::Ok,this).exec();
    145                                         return;
    146                                 } else if (row[y] < 0) {
    147                                         QMessageBox(QMessageBox::Critical,trUtf8("Ошибка в данных"),QString(trUtf8("Ошибка в ячейке [Строка %1; Колонка %2]: Значение не может быть меньше нуля.")).arg(x + 1).arg(y + 1),QMessageBox::Ok,this).exec();
    148                                         return;
    149                                 }
     78        for (int r = 0; r < n; r++) {
     79                row = new double[n];
     80                for (int c = 0; c < n; c++) {
     81                        row[c] = tspmodel->index(r,c).data(Qt::UserRole).toDouble(&ok);
     82                        if (!ok) {
     83                                QMessageBox(QMessageBox::Critical,trUtf8("Ошибка в данных"),QString(trUtf8("Ошибка в ячейке [Строка %1; Колонка %2]: Неверный формат данных.")).arg(r + 1).arg(c + 1),QMessageBox::Ok,this).exec();
     84                                return;
    15085                        }
    15186                }
  • trunk/src/mainwindow.h

    r12 r15  
    2929#include "settingsdialog.h"
    3030#include "tspsolver.h"
     31#include "tspmodel.h"
    3132
    3233class MainWindow: public QMainWindow, Ui::MainWindow
     
    4142        void CitiesNumberChanged(int n);
    4243private:
    43         void PrepareTable();
    44         int rand(int, int);
     44        CTSPModel *tspmodel;
    4545        int randMin;
    4646        int randMax;
  • trunk/src/tspmodel.cpp

    r14 r15  
    11/*
    22 *  TSPSG - TSP Solver and Generator
    3  *  Copyright (C) 2007 L¸ppa <lacontacts[at]gmail[dot]com>
     3 *  Copyright (C) 2007 Lёppa <lacontacts[at]gmail[dot]com>
    44 *
    55 *  $Id$
     
    2626
    2727CTSPModel::CTSPModel(QObject *parent)
    28         : QAbstractTableModel(parent), randMin(1), randMax(10)
     28        : QAbstractTableModel(parent), randMin(1), randMax(10), nCities(0)
    2929{
    3030}
     
    4848{
    4949        if (role == Qt::DisplayRole)
    50                 return trUtf8("Ãîðîä %1").arg(section + 1);
     50                return trUtf8("Город %1").arg(section + 1);
    5151        return QVariant();
    5252}
     
    5858        if (role == Qt::TextAlignmentRole)
    5959                return int(Qt::AlignCenter);
    60         else if (role == Qt::DisplayRole) {
    61                 if (index.row() == index.column())
    62                         return trUtf8("---");
     60        else if (role == Qt::FontRole) {
     61QFont font;
     62                font.setBold(true);
     63                return font;
     64        } else if (role == Qt::DisplayRole || role == Qt::EditRole) {
    6365                if (index.row() < nCities && index.column() < nCities)
    64                         return table.at(index.row())->at(index.column());
     66                        if (table[index.row()][index.column()] == INFINITY)
     67                                return trUtf8(INFSTR);
     68                        else
     69                                // HACK: Converting to string to prevent spinbox in edit mode
     70                                return QVariant(table[index.row()][index.column()]).toString();
    6571                else
    6672                        return QVariant();
    67         }
     73        } else if (role == Qt::UserRole)
     74                return table[index.row()][index.column()];
    6875        return QVariant();
    6976}
     
    7178bool CTSPModel::setData(const QModelIndex &index, const QVariant &value, int role)
    7279{
    73         return true;
     80        if (!index.isValid())
     81                return false;
     82        if (role == Qt::EditRole && index.row() != index.column()) {
     83                if (value.toString().compare(INFSTR) == 0)
     84                        table[index.row()][index.column()] = INFINITY;
     85                else {
     86bool ok;
     87double tmp = value.toDouble(&ok);
     88                        if (!ok || tmp < 0)
     89                                return false;
     90                        else
     91                                table[index.row()][index.column()] = tmp;
     92                }
     93                emit dataChanged(index,index);
     94                return true;
     95        }
     96        return false;
    7497}
    7598
     
    77100{
    78101Qt::ItemFlags flags = QAbstractItemModel::flags(index);
    79         if (index.row() == index.column())
     102        if (index.row() != index.column())
    80103                flags |= Qt::ItemIsEditable;
    81104        return flags;
     
    89112void CTSPModel::setNumCities(int n)
    90113{
     114        if (n == nCities)
     115                return;
     116        emit layoutAboutToBeChanged();
    91117        if (n > nCities) {
    92                 foreach(QList<double> *row,table) {
    93                         for (int k = nCities; k < n; k++)
    94                                 row->append(rand(randMin,randMax));
     118                for (int r = 0; r < nCities; r++) {
     119                        for (int c = nCities; c < n; c++)
     120                                if (r == c)
     121                                        table[r][c] = INFINITY;
     122                                else
     123                                        table[r][c] = rand(randMin,randMax);
    95124                }
    96                 for (int k = nCities; k < n; k++) {
    97 QList<double> *row = new QList<double>[n];
    98                         foreach(double cell,*row)
    99                                 cell = rand(randMin,randMax);
    100                         table.append(row);
     125                for (int r = nCities; r < n; r++) {
     126                        for (int c = 0; c < n; c++)
     127                                if (r == c)
     128                                        table[r][c] = INFINITY;
     129                                else
     130                                        table[r][c] = rand(randMin,randMax);
    101131                }
    102         } else if (n < nCities) {
    103                 // TODO: Shrinking table
    104132        }
    105133        nCities = n;
     134        emit layoutChanged();
    106135}
    107136
     137void CTSPModel::randomize()
     138{
     139        for (int r = 0; r < nCities; r++)
     140                for (int c = 0; c < nCities; c++)
     141                        if (r != c)
     142                                table[r][c] = rand(randMin,randMax);
     143        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
     144}
     145
  • trunk/src/tspmodel.h

    r14 r15  
    11/*
    22 *  TSPSG - TSP Solver and Generator
    3  *  Copyright (C) 2007 L¸ppa <lacontacts[at]gmail[dot]com>
     3 *  Copyright (C) 2007 Lёppa <lacontacts[at]gmail[dot]com>
    44 *
    55 *  $Id$
     
    2525#define TSPMODEL_H
    2626
     27// Decided, that static array with 100 of cities maximum hard limit
     28// will be enough for most cases, but the code will be simplier than
     29// when using dynamic lists. If you need more, just change this value
     30// and recompile the program ;-)
     31#define MAX_CITIES 100
     32// This value means infinity :-)
     33#define INFINITY 1.7E+308
     34// This is string, which represents infinite value in table
     35#define INFSTR "---"
     36
    2737#include <QAbstractTableModel>
    2838
     
    4050        int numCities() const;
    4151        void setNumCities(int);
     52        void randomize();
    4253        int randMin;
    4354        int randMax;
    4455private:
    45         QList<QList<double> *> table;
     56        double table[MAX_CITIES][MAX_CITIES];
    4657        int nCities;
    4758        int rand(int, int);
  • trunk/src/tspsolver.cpp

    r13 r15  
    2323
    2424#include "tspsolver.h"
     25#include "tspmodel.h"
    2526
    2627CTSPSolver::CTSPSolver()
     
    3031double CTSPSolver::findMinInRow(int nRow, tMatrix matrix)
    3132{
    32 double min = infinity;
     33double min = INFINITY;
    3334        for (int k = 0; k < nCities; k++)
    3435                if (min > matrix[nRow][k])
    3536                        min = matrix[nRow][k];
    36         return min == infinity ? 0 : min;
     37        return min == INFINITY ? 0 : min;
    3738}
    3839
    3940double CTSPSolver::findMinInCol(int nCol, tMatrix matrix)
    4041{
    41 double min = infinity;
     42double min = INFINITY;
    4243        for (int k = 0; k < nCities; k++)
    4344                if (min > matrix[k][nCol])
    4445                        min = matrix[k][nCol];
    45         return min == infinity ? 0 : min;
     46        return min == INFINITY ? 0 : min;
    4647}
    4748
  • trunk/src/tspsolver.h

    r13 r15  
    2727#include <QtCore>
    2828
    29 const double infinity = 1.7E+308;
    30 
    3129typedef QList<double *> tMatrix;
    3230
    33 // Structure represent one step of solving
     31// This structure represents one step of solving
    3432// The tree of such elements will represent the solving process
    3533struct sStep {
Note: See TracChangeset for help on using the changeset viewer.