Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2013, 12:50   #11
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

продолжение файла mdiwindow.cpp

Код:
  exitAction = new QAction( tr("E&xit"), this );
  exitAction->setShortcut( tr("Ctrl+Q") );
  exitAction->setStatusTip( tr("Quit the application") );
  connect( exitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()) );
  

  cutAction = new QAction( QIcon(":/images/cut.png"), tr("Cu&t"), this );
  cutAction->setShortcut( tr("Ctrl+X") );
  cutAction->setStatusTip( tr("Cut") );
  cutAction->setEnabled(false);
  connect( cutAction, SIGNAL(triggered()), this, SLOT(editCut()) );
  
  copyAction = new QAction( QIcon(":/images/copy.png"), tr("&Copy"), this );
  copyAction->setShortcut( tr("Ctrl+C") );
  copyAction->setStatusTip( tr("Copy") );
  copyAction->setEnabled(false);
  connect( copyAction, SIGNAL(triggered()), this, SLOT(editCopy()) );

  pasteAction = new QAction( QIcon(":/images/paste.png"), tr("&Paste"), this );
  pasteAction->setShortcut( tr("Ctrl+V") );
  pasteAction->setStatusTip( tr("Paste") );
  connect( pasteAction, SIGNAL(triggered()), this, SLOT(editPaste()) );
  

  tileAction = new QAction( tr("&Tile"), this );
  tileAction->setStatusTip( tr("Tile the windows") );
  connect( tileAction, SIGNAL(triggered()), workspace, SLOT(tile()) );
  
  cascadeAction = new QAction( tr("&Cascade"), this );
  cascadeAction->setStatusTip( tr("Cascade the windows") );
  connect( cascadeAction, SIGNAL(triggered()), workspace, SLOT(cascade()) );

  nextAction = new QAction( tr("&Next window"), this );
  nextAction->setStatusTip( tr("Move to the next window") );
  connect( nextAction, SIGNAL(triggered()), workspace, SLOT(activateNextWindow()) );
  
  previousAction = new QAction( tr("&Previous window"), this );
  previousAction->setStatusTip( tr("Move to the previous window") );
  connect( previousAction, SIGNAL(triggered()), workspace, SLOT(activatePreviousWindow()) );
  
  separatorAction = new QAction( this );
  separatorAction->setSeparator( true );
  

  aboutAction = new QAction( tr("&About"), this );
  aboutAction->setStatusTip( tr("About this application") );
  connect( aboutAction, SIGNAL(triggered()), this, SLOT(helpAbout()) );

  aboutQtAction = new QAction( tr("About &Qt"), this );
  aboutQtAction->setStatusTip( tr("About the Qt toolkit") );
  connect( aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()) );
}

void MdiWindow::createMenus()
{
  QMenu *menu;
  
  menu = menuBar()->addMenu( tr("&File") );
  menu->addAction( newAction );
  menu->addAction( closeAction );
  menu->addSeparator();
  menu->addAction( exitAction );
  
  menu = menuBar()->addMenu( tr("&Edit") );
  menu->addAction( cutAction );
  menu->addAction( copyAction );
  menu->addAction( pasteAction );
  
  windowMenu = menuBar()->addMenu( tr("&Window") );
  connect( windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowList()) );
  
  menu = menuBar()->addMenu( tr("&Help") );
  menu->addAction( aboutAction );
  menu->addAction( aboutQtAction );
}

void MdiWindow::createToolbars()
{
  QToolBar *toolbar;
  
  toolbar = addToolBar( tr("File") );
  toolbar->addAction( newAction );
  
  toolbar = addToolBar( tr("Edit") );
  toolbar->addAction( cutAction );
  toolbar->addAction( copyAction );
  toolbar->addAction( pasteAction );
}

void MdiWindow::editCut()
{
  activeDocument()->cut();
}
  
void MdiWindow::editCopy()
{
  activeDocument()->copy();
}
  
void MdiWindow::editPaste()
{
  activeDocument()->paste();
}

void MdiWindow::updateWindowList()
{
  windowMenu->clear();
  
  windowMenu->addAction( tileAction );
  windowMenu->addAction( cascadeAction );
  windowMenu->addSeparator();
  windowMenu->addAction( nextAction );
  windowMenu->addAction( previousAction );
  windowMenu->addAction( separatorAction );
  
  int i=1;
  foreach( QWidget *w, workspace->windowList() )
  {
    QString text;
    if( i<10 )
      text = tr("&%1 %2").arg( i++ ).arg( w->windowTitle() );
    else
      text = w->windowTitle();
      
    QAction *action = windowMenu->addAction( text );
    action->setCheckable( true );
    action->setChecked( w == activeDocument() );
    connect( action, SIGNAL(triggered()), mapper, SLOT(map()) );
    mapper->setMapping( action, w );
  }
}
продолжение проекта mdi в следующем сообщении
8Observer8 вне форума Ответить с цитированием
Старый 14.01.2013, 12:53   #12
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

продолжение проекта mdi

documentwindow.h
Код:
#ifndef DOCUMENTWINDOW_H
#define DOCUMENTWINDOW_H

#include <QTextEdit>

class DocumentWindow : public QTextEdit
{
  Q_OBJECT
  
public:
  DocumentWindow( QWidget *parent = 0 );
  
protected:
  void closeEvent( QCloseEvent *event );
  
private:
  bool isSafeToClose();
};
  
#endif // DOCUMENTWINDOW_H
documentwindow.cpp
Код:
#include <QApplication>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QCloseEvent>
#include <QMessageBox>

#include <QTextEdit>

#include "documentwindow.h"

DocumentWindow::DocumentWindow( QWidget *parent ) : QTextEdit( parent )
{
  setAttribute( Qt::WA_DeleteOnClose );
  setWindowTitle( tr("%1[*]" ).arg("unnamed") );
  
  connect( document(), SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool)) );
}
  
void DocumentWindow::closeEvent( QCloseEvent *event )
{
  if( isSafeToClose() )
    event->accept();
  else
    event->ignore();
}

bool DocumentWindow::isSafeToClose()
{
  if( document()->isModified() ) 
  {
    switch( QMessageBox::warning( this, tr("MDI"), 
      tr("The document has unsaved changes.\n"
         "Do you want to save it before it is closed?"), 
         QMessageBox::Discard | QMessageBox::Cancel ) )
    {
    case QMessageBox::Cancel:
      return false;
    default:
      return true;
    }
  }

  return true;
}
8Observer8 вне форума Ответить с цитированием
Старый 14.01.2013, 12:56   #13
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Потом покажу, как работать с табличными данными XML в Qt C++.

XML - стандарт для хранения табличных данных.

matrix.xml

Код:
<Matrix> 
<Description> 
        <rows>3</rows> 
        <columns>4</columns> 
</Description> 
<row> 
        <cell>23.7</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>23.9</cell>       
</row> 
<row> 
        <cell>13.0</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>2</cell>  
</row> 
<row> 
        <cell>2.5</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>23.9</cell>       
</row> 
</Matrix>
8Observer8 вне форума Ответить с цитированием
Старый 14.01.2013, 16:23   #14
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Установил более свежую версию Qt (у меня была 4.7) "Qt libraries 4.8.4 for Windows (minGW 4.4, 317 MB)": http://qt-project.org/downloads#qt-lib

Оказалось, что в составе SDK отсутствует Qt Creator. Пришлось отдельно поставить: http://qt-project.org/downloads#qt-creator

5:57 pm
1/14/2013

Так и не удалось настроить Qt Creator и SDK 4.8.4. Опять поставил SDK 4.7.4 в составе которого есть Qt Creator. Надо будет позже попробовать SDK 5.0.0. Интересно, есть ли там Qt Creator...

Последний раз редактировалось 8Observer8; 14.01.2013 в 18:50.
8Observer8 вне форума Ответить с цитированием
Старый 14.01.2013, 18:56   #15
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Загрузка матрицы из xml-файла

matrix.xml
Код:
<Matrix> 
<Description> 
        <rows>3</rows> 
        <columns>4</columns> 
</Description> 
<row> 
        <cell>23.7</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>23.9</cell>       
</row> 
<row> 
        <cell>13.0</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>2</cell>  
</row> 
<row> 
        <cell>2.5</cell> 
        <cell>2.7</cell> 
        <cell>3.7</cell> 
        <cell>23.9</cell>       
</row> 
</Matrix>
После запуска программы появляется окно:



Выбираем в меню Load или нажимаем кнопку на панели инструментов. Появляется окно выбора файла:



Выбираем файл. Матрица загружена в двумерный динамический массив и в элемент GUI QTableWidget:



main.cpp
Код:
#include "loadmatrixmainwindow.h"
#include <QApplication>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    LoadMatrixMainWindow mw;
    mw.show();

    app.exec();
}
loadmatrixmainwindow.h
Код:
#ifndef LOADMATRIXMAINWINDOW_H
#define LOADMATRIXMAINWINDOW_H

#include <QMainWindow>

class QTableWidget;
class QAction;

class LoadMatrixMainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit LoadMatrixMainWindow(QWidget *parent = 0);
    
signals:
    
private slots:
    void loadMatrixSLOT();
    
private:
    void createActions();
    void createMenus();
    void createToolbars();
    bool loadMatrixFromXmlFile(QString filename);
    void fillMatrixWidget();
    double **matrix;
    int nrows;
    int ncols;
    QTableWidget *matrixWidget;
    QAction *loadAction;
};

#endif // LOADMATRIXMAINWINDOW_H
loadmatrixmainwindow.cpp
Код:
#include "loadmatrixmainwindow.h"
#include "QTableWidget"
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QFileDialog>
#include <QStatusBar>
#include <QMessageBox>
#include <QDomDocument>
#include <QDomElement>
#include <QDomText>
#include <QDebug>

LoadMatrixMainWindow::LoadMatrixMainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    matrixWidget = new QTableWidget(this);
    setCentralWidget(matrixWidget);

    createActions();
    createMenus();
    createToolbars();
}

void LoadMatrixMainWindow::createActions()
{
    loadAction = new QAction(QIcon(":/images/load.png"), tr("&Load"), this);

    connect(loadAction, SIGNAL(triggered()), this, SLOT(loadMatrixSLOT()));
}

void LoadMatrixMainWindow::createMenus()
{
    QMenu *menu;

    menu = menuBar()->addMenu(tr("File"));
    menu->addAction(loadAction);
}

void LoadMatrixMainWindow::createToolbars()
{
    QToolBar *toolbar;

    toolbar = addToolBar(tr("File"));
    toolbar->addAction(loadAction);
}

void LoadMatrixMainWindow::loadMatrixSLOT()
{
    QString filename = QFileDialog::getOpenFileName(this,
                                                    tr("LoadMatrix"),
                                                    QDir::currentPath(),
                                                    tr("XML Matrix (*.xml)"));

    if (!filename.isNull()) {
        statusBar()->showMessage(filename);

        if (loadMatrixFromXmlFile(filename)) {

        }
    }
}
продолжение файла loadmatrixmainwindow.cpp в следующем сообщении
8Observer8 вне форума Ответить с цитированием
Старый 14.01.2013, 18:58   #16
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

продолжение файла loadmatrixmainwindow.cpp

Код:
bool LoadMatrixMainWindow::loadMatrixFromXmlFile(QString filename)
{
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::critical(this, tr("Error"), tr("Failed to open file for reading"));
        return false;
    }

    QDomDocument document;
    if (!document.setContent(&file)) {
        QMessageBox::critical(this, tr("Error"), tr("Failed to parse the file into a DOM tree"));
        file.close();
        return false;
    }

    file.close();

    QDomElement matrixElement = document.documentElement();

    QDomNode descriptionNode = matrixElement.firstChild();
    QDomElement descriptionElement = descriptionNode.toElement();

    // Read nrows
    QDomNode nrowsNode = descriptionElement.firstChild();
    QDomElement nrowsElement = nrowsNode.toElement();
    QDomNode nrowsTextNode = nrowsElement.firstChild();
    QDomText nrowsText = nrowsTextNode.toText();
    nrows = (nrowsText.data()).toInt();

    // Read ncols
    QDomNode ncolsNode = nrowsNode.nextSibling();
    QDomElement ncolsElement = ncolsNode.toElement();
    QDomNode ncolsTextNode = ncolsElement.firstChild();
    QDomText ncolsText = ncolsTextNode.toText();
    ncols = (ncolsText.data()).toInt();

    matrix = new double *[nrows];

    for (int i = 0; i < nrows; i++) {
        matrix[i] = new double[ncols];
    }

    QDomNode *rowNode = new QDomNode[nrows];
    QDomNode *cellNode = new QDomNode[ncols];

    for (int i = 0; i < nrows; i++) {
        if (i == 0) {
            rowNode[i] = descriptionNode.nextSibling();
        }
        else {
            rowNode[i] = rowNode[i-1].nextSibling();
        }
        QDomElement rowElement = rowNode[i].toElement();
        for (int j = 0; j < ncols; j++) {
            if (j == 0) {
                cellNode[j] = rowElement.firstChild();
            }
            else {
                cellNode[j] = cellNode[j-1].nextSibling();
            }
            QDomElement cellElement = cellNode[j].toElement();
            QDomNode cellTextNode = cellElement.firstChild();
            QDomText cellText = cellTextNode.toText();
            matrix[i][j] = cellText.data().toDouble();
        }
    }

    delete [] rowNode;
    delete [] cellNode;

//    for (int i = 0; i < nrows; i++) {
//        delete [] matrix[i];
//    }
//    delete [] matrix;

    fillMatrixWidget();

    return true;
}

void LoadMatrixMainWindow::fillMatrixWidget()
{
    matrixWidget->setShowGrid(true);
    matrixWidget->setRowCount(nrows);
    matrixWidget->setColumnCount(ncols);

    for (int i = 0; i < nrows; i++) {
        for (int j = 0; j < ncols; j++) {
            QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg(matrix[i][j]));
            newItem->setTextAlignment(Qt::AlignCenter);
            matrixWidget->setItem(i, j, newItem);
        }
    }
}
P.S. Если кто-то читает эти сообщения, подскажите пожалуйста, как быть с закомментированным кодом? То есть где освободить память занятой двумерным динамическим массивам? Я думаю в деструкторе окна... Как его правильно написать?

Последний раз редактировалось 8Observer8; 14.01.2013 в 19:05.
8Observer8 вне форума Ответить с цитированием
Старый 16.01.2013, 12:24   #17
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение

Наверняка вы учите английский, поэтому вам с головой хватит http://translate.google.com/ Даже если вы его очень плохо знаете (как я)
я начал изучать английский с сентября месяца, до этого учил немецкий
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 16.01.2013, 12:46   #18
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

если не ошибаюсь, то деструкторы прописывать не надо. так как QT сделает все сам, если удаляется главное окно
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 16.01.2013, 13:26   #19
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от Артём Волжанкин Посмотреть сообщение
если не ошибаюсь, то деструкторы прописывать не надо. так как QT сделает все сам, если удаляется главное окно
Мне нужно память от массива освободить.

Куда вот этот код поместить:

Код:
    for (int i = 0; i < nrows; i++) {
        delete [] matrix[i];
    }
    delete [] matrix;
Этот код в последнем файле закомментирован. После него вызывается функция fillMatrixWidget() в которой используется массив matrix[][].

Согласен, в данном примере можно было бы освободить массив после вызова функции.

Но есть такая ситуация, я в конструкторе окна создал массив matrix[][]. И использую его в различных функция своего приложения. И вот я завершаю приложение. Где мне его освободить? Я так понимаю, что Qt освобождает память от своих объектов, но не от стандартных. Хотя... когда приложение завершится, то matrix[][] сам собой удалится в любом случае. Может поэтому в С++ можно и не освобождать память от matrix[][] при завершении приложения... и ничего страшного не будет
8Observer8 вне форума Ответить с цитированием
Старый 16.01.2013, 15:27   #20
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Я думаю в деструкторе окна... Как его правильно написать?
в деструктор напиши

Последний раз редактировалось rrrFer; 16.01.2013 в 15:28. Причина: ошибся )
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что лучше использовать? Lindemann66 C/C++ Базы данных 11 01.09.2011 10:21
3d графики: что вообще есть и что лучше использовать Krasi Общие вопросы по Java, Java SE, Kotlin 1 09.05.2011 14:41
MS рекомендует использовать AutoComplete в GUI Glen Свободное общение 0 04.04.2011 22:43
Обработка сигнала - что использовать? gooff Компьютерное железо 3 02.07.2008 12:13
Обработка сигнала - что использовать! gooff Помощь студентам 4 22.06.2008 20:57