Russian Qt Forum
Апрель 25, 2024, 11:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск дублируемых чисел из подключаемой библиотеки  (Прочитано 7076 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« : Октябрь 03, 2015, 14:34 »

Всем привет.
Надеюсь я в правильынй раздел форума пишу.
задача такая, есть QT программа, в которой загружается из файла набор чисел
829
71, 48, 21, 100, 1, 19
113, 35, 3, 39, 15
13, 28, 3, 3, 41
123, 231, 1234
Строк с числами много. Так вот есть интерфейс получающий данные из файла, и требуется во внешней библиотеке сделать метод поиска дублируемых чисел. Например 123 это дублируемое число 231, но 1234 это уже другое число.
У меня из за малого опыта работы с QT хотя и самого программирование нету понимания как обратится к данным QTextEdit который содержит загруженные данные и обращение библиотеке к ним дял нужного поиска. Хотя даже и с самим алгаритмом вопросы имеются. Ниже приведу код имеющийся. Если кто знает то подскажите пожалуйста как тут решить задачу. Заранее большое спасибо.
###CMainWindow.hpp###
Код:
#ifndef TESTDUPLECATES_MAINWINDOW_HPP
#define TESTDUPLECATES_MAINWINDOW_HPP

#include <QtWidgets>

class CMainWindow: public QWidget
{
Q_OBJECT
public:
    CMainWindow(QWidget *parent = 0);
    ~CMainWindow();
private:
    QHBoxLayout *mainLayoutH;
    QHBoxLayout *buttonsLayoutH;
    QVBoxLayout *rightLayoutV;
    QVBoxLayout *displayLayout;

    QFrame      *leftFrame;
    QFrame      *rightFrame;
    QFrame      *bottonsFrame;

    QPushButton *buttonOpenFile;
    QPushButton *buttonFind;
    QPushButton *buttonSave;

    QTextEdit   *displayContentOfFile;
    QTextEdit   *infoAboutDup;

    void initWidgets();
    void initConnect();
private slots:
    void slotOpenFile();
    void slotFindDuplicates();
    void slotSaveInfo();
};
#endif //TESTDUPLECATES_MAINWINDOW_HPP
###CManiWindow.cpp###
Код:
#include "CMainWindow.hpp"
CMainWindow::CMainWindow(QWidget *parent) : QWidget(parent)
{
    initWidgets();
    initConnect();
}

CMainWindow::~CMainWindow()
{

}

void CMainWindow::initWidgets()
{
    leftFrame = new QFrame();
    leftFrame->setLineWidth(1);
    leftFrame->setFixedSize(400, 500);
    rightFrame= new QFrame();
    rightFrame->setLineWidth(2);
    rightFrame->setFixedSize(300, 500);

    displayContentOfFile = new QTextEdit();
    displayContentOfFile->setReadOnly(true);

    displayLayout = new QVBoxLayout(leftFrame);
    displayLayout->setMargin(0);
    displayLayout->setSpacing(0);
    displayLayout->addWidget(displayContentOfFile);

    bottonsFrame = new QFrame();

    buttonOpenFile = new QPushButton("Open");
    buttonFind = new QPushButton("Find");
    buttonSave = new QPushButton("Save");

    buttonsLayoutH = new QHBoxLayout(bottonsFrame);
    buttonsLayoutH->addWidget(buttonOpenFile);
    buttonsLayoutH->addWidget(buttonFind);
    buttonsLayoutH->addWidget(buttonSave);

    infoAboutDup = new QTextEdit();
    infoAboutDup->setReadOnly(false);

    rightLayoutV = new QVBoxLayout(rightFrame);
    rightLayoutV->addWidget(bottonsFrame);
    rightLayoutV->addWidget(infoAboutDup);

    mainLayoutH = new QHBoxLayout(this);
    mainLayoutH->addWidget(leftFrame);
    mainLayoutH->addWidget(rightFrame);
    mainLayoutH->setMargin(0);
    mainLayoutH->setSpacing(0);
}
void CMainWindow::initConnect()
{
    connect(buttonOpenFile, SIGNAL(clicked()), this, SLOT(slotOpenFile()));
    connect(buttonFind, SIGNAL(clicked()), this, SLOT(slotFindDuplicates()));
    connect(buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveInfo()));
}

void CMainWindow::slotOpenFile()
{
    QString file = QFileDialog::getOpenFileName(this, "Open File", "", "Text File(*.txt)");

    QFile f(file);
    if (!file.isEmpty())
    {
        if(!f.open(QIODevice::ReadOnly))
        {
            QMessageBox::critical(this, "Error", "Error opening file");
            return;
        }
        QString text = f.readAll();
        displayContentOfFile->setPlainText(text);
        f.close();
        qDebug() << file;
    }
}
void CMainWindow::slotFindDuplicates()
{

}
void CMainWindow::slotSaveInfo()
{
    QString filename = QFileDialog::getSaveFileName(this, "Save File", "", "*.txt");

    QFile f(filename);
    if (!filename.isEmpty())
    {
        if (!f.open(QIODevice::WriteOnly))
        {
            QMessageBox::critical(this, "Error", "Error writing text file!");
            return;
        }
        f.write(infoAboutDup->toPlainText().toLatin1());
        f.close();
        qDebug() << filename;
    }
}
###subdir/MyDuplicates.hpp###
Код:
#ifndef TESTDUPLECATES_MYDUPLICATES_HPP
#define TESTDUPLECATES_MYDUPLICATES_HPP

class MyDuplicates
{

};
#endif //TESTDUPLECATES_MYDUPLICATES_HPP
Ну и само собою тут пока так же ничего не реализовано.
###/subdir/MyDuplicates.cpp###
Код:
#include "MyDuplicates.hpp"
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Октябрь 04, 2015, 08:18 »

Название темы не соответствуют описанию проблемы Улыбающийся
В CManiWindow.cpp инклудьте MyDuplicates.hpp и используйте класс MyDuplicates
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 04, 2015, 09:50 »

Строк с числами много. Так вот есть интерфейс получающий данные из файла, и требуется во внешней библиотеке сделать метод поиска дублируемых чисел. Например 123 это дублируемое число 231, но 1234 это уже другое число.
У меня из за малого опыта работы с QT хотя и самого программирование нету понимания как обратится к данным QTextEdit который содержит загруженные данные и обращение библиотеке к ним дял нужного поиска. Хотя даже и с самим алгаритмом вопросы имеются. Ниже приведу код имеющийся. Если кто знает то подскажите пожалуйста как тут решить задачу.
Следуйте правилу форума: один топик - одна тема. Что Вы хотели выяснить? "Дублирующие числа", "обращение к QTextEdit" или "обращение библиотеке". Давайте что-то одно и подробно
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #3 : Октябрь 04, 2015, 10:59 »

Следуйте правилу форума: один топик - одна тема. Что Вы хотели выяснить? "Дублирующие числа", "обращение к QTextEdit" или "обращение библиотеке". Давайте что-то одно и подробно
[/quote]

Извиняюсь если я не правильно выбрал раздел форума, первый раз столкнулся с этой проблемой и не знал как лучше описать и спросить на форуме. Я пытаюсь понять как из внешней библиотеки я должен обращаться к данным QTextEdit(так же если я что то нахожу из дублируемых чисел я посылаю вывод уже в другой QTextEdit). Ну и само собою уже во внешней этой библиотеке поиск дублируемого числа.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Октябрь 04, 2015, 13:20 »

Содержимое QTextEdit придется разпарсить на числа, разделенные запятыми. Положите их в QStringList и передайте в библиотечну функцию.

В функции берем каждую строку и посимвольно засовываем в QMap<QChar, int>  , где ключ это символ, int  это количество символов. В итогде получаем смисок мэпов.

Далее сравниваем мэпы друг с другом и находим дубликаты. Все.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #5 : Октябрь 04, 2015, 14:20 »

Содержимое QTextEdit придется разпарсить на числа, разделенные запятыми. Положите их в QStringList и передайте в библиотечну функцию.

В функции берем каждую строку и посимвольно засовываем в QMap<QChar, int>  , где ключ это символ, int  это количество символов. В итогде получаем смисок мэпов.

Далее сравниваем мэпы друг с другом и находим дубликаты. Все.

хм, попробую понять как это сделать) (опыта не много). А скажите как мне с библиотеки обратиться к QTextEdit где данные которые нужно будет разабрать? Я правильно понимаю что я должен подключить класс где все виджеты указаны в подключаемой библиотеке?
Потому что если я подключаю так
Код:
#include "../CMainWindow.hpp"

class MyDuplicates : public CMainWindow
{

};


#endif //TESTDUPLECATES_MYDUPLICATES_HPP

То получаю ошибку
../CMainWindow.hpp:9:21: fatal error: QtWidgets: Нет такого файла или каталога
« Последнее редактирование: Октябрь 04, 2015, 14:23 от SektorCT » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Октябрь 04, 2015, 16:43 »

А зачем обращаться из библиотеки к QTextEdit? Это должна ваша программа делать. Получить содержимое из QTextEdit через text(), распарсить и вызвать библиотечный метод, который и найдет дубликаты (если в общем).

Библиотека ничего не должна знать, где содержатся ваши данные. Ее дело - получить их, обработать и отдать результат.

По хорошему, она должна иметь функцию типа

Код:
QStringList FindDuplicates(const QStringList& inputData) const

где inputData - это список отдельных элементов из вашего QTextEdit, а результат - список найденных дубликатов (не знаю, что дальше будете с ними делать, поэтому пока QStringList, хотя мог бы быть список индексов и т.д.).

А в вашей программе у вас будет что-то типа этого:

Код:
...
QString text = myTextEdit->text();  // myTextEdit - это ваш QTextEdit

QStringList splitText = text.split(",", QString::SkipEmptyParts);

QStringList duplicates = MyDuplicates::FindDuplicates(splitText);  // FindDuplicates - это и есть ваша функция из библиотеки

« Последнее редактирование: Октябрь 04, 2015, 16:56 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #7 : Октябрь 04, 2015, 17:08 »

Код:
...
QString text = myTextEdit->text();  // myTextEdit - это ваш QTextEdit

QStringList splitText = text.split(",", QString::SkipEmptyParts);

QStringList duplicates = MyDuplicates::FindDuplicates(splitText);  // FindDuplicates - это и есть ваша функция из библиотеки


А эти данные должны быть уже при нажатии на кнопку быть готовы для передачи в библиотеку или именно в самом слоте нужно делать?

И такого метода у QTextEdit как text() я не нашол. toPlainText есть а вот text нету.
« Последнее редактирование: Октябрь 04, 2015, 17:10 от SektorCT » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Октябрь 04, 2015, 19:22 »

И такого метода у QTextEdit как text() я не нашол. toPlainText есть а вот text нету.

да, toPlainText(), конечно, извиняюсь.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #9 : Октябрь 04, 2015, 22:04 »

И такого метода у QTextEdit как text() я не нашол. toPlainText есть а вот text нету.

да, toPlainText(), конечно, извиняюсь.

Кидаю весь код что есть сейчас кроме CMainWindow.hpp, он без изменений.
CMainWindow.cpp
Код:
//
// Created by blin on 02.10.15.
//

#include "CMainWindow.hpp"
#include "subdir/MyDuplicates.hpp"
CMainWindow::CMainWindow(QWidget *parent) : QWidget(parent)
{
    initWidgets();
    initConnect();
}

CMainWindow::~CMainWindow()
{

}

void CMainWindow::initWidgets()
{
    leftFrame = new QFrame();
    leftFrame->setLineWidth(1);
    leftFrame->setFixedSize(400, 500);
    rightFrame= new QFrame();
    rightFrame->setLineWidth(2);
    rightFrame->setFixedSize(300, 500);

    displayContentOfFile = new QTextEdit();
    displayContentOfFile->setReadOnly(true);

    displayLayout = new QVBoxLayout(leftFrame);
    displayLayout->setMargin(0);
    displayLayout->setSpacing(0);
    displayLayout->addWidget(displayContentOfFile);

    bottonsFrame = new QFrame();

    buttonOpenFile = new QPushButton("Open");
    buttonFind = new QPushButton("Find");
    buttonSave = new QPushButton("Save");

    buttonsLayoutH = new QHBoxLayout(bottonsFrame);
    buttonsLayoutH->addWidget(buttonOpenFile);
    buttonsLayoutH->addWidget(buttonFind);
    buttonsLayoutH->addWidget(buttonSave);

    infoAboutDup = new QTextEdit();
    infoAboutDup->setReadOnly(false);

    rightLayoutV = new QVBoxLayout(rightFrame);
    rightLayoutV->addWidget(bottonsFrame);
    rightLayoutV->addWidget(infoAboutDup);

    mainLayoutH = new QHBoxLayout(this);
    mainLayoutH->addWidget(leftFrame);
    mainLayoutH->addWidget(rightFrame);
    mainLayoutH->setMargin(0);
    mainLayoutH->setSpacing(0);
}
void CMainWindow::initConnect()
{
    connect(buttonOpenFile, SIGNAL(clicked()), this, SLOT(slotOpenFile()));
    connect(buttonFind, SIGNAL(clicked()), this, SLOT(slotFindDuplicates()));
    connect(buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveInfo()));
}

void CMainWindow::slotOpenFile()
{
    QString file = QFileDialog::getOpenFileName(this, "Open File", "", "Text File(*.txt)");

    QFile f(file);
    if (!file.isEmpty())
    {
        if(!f.open(QIODevice::ReadOnly))
        {
            QMessageBox::critical(this, "Error", "Error opening file");
            return;
        }
        QString text = f.readAll();
        displayContentOfFile->setPlainText(text);
        f.close();
        qDebug() << file;
    }
}
void CMainWindow::slotFindDuplicates()
{
    QString text = displayContentOfFile->toPlainText();

    QStringList splitText = text.split(",", QString::SkipEmptyParts);

    QStringList duplicates = MyDuplicates::FindDuplicates(splitText);
}
void CMainWindow::slotSaveInfo()
{
    QString filename = QFileDialog::getSaveFileName(this, "Save File", "", "*.txt");

    QFile f(filename);
    if (!filename.isEmpty())
    {
        if (!f.open(QIODevice::WriteOnly))
        {
            QMessageBox::critical(this, "Error", "Error writing text file!");
            return;
        }
        //f.write(displayContentOfFile->toPlainText().toLatin1());
        f.close();
        qDebug() << filename;
    }
}

MyDuplicates.hpp
Код:
#ifndef TESTDUPLECATES_MYDUPLICATES_HPP
#define TESTDUPLECATES_MYDUPLICATES_HPP


#include <QStringList>

class MyDuplicates
{
public:
    QStringList FindDuplicates(const QStringList& inputData) const;
};


#endif //TESTDUPLECATES_MYDUPLICATES_HPP

MyDuplicates.cpp
Код:
#include "MyDuplicates.hpp"
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Октябрь 04, 2015, 22:25 »

Если MyDuplicates - это класс, а не неймспейс, то тогда FindDuplicates надо сделать статическим:

Код:
static QStringList FindDuplicates(const QStringList& inputData); 

А где имплементация? Что-то по видимому недокопировалось...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #11 : Октябрь 04, 2015, 22:31 »

Если MyDuplicates - это класс, а не неймспейс, то тогда FindDuplicates надо сделать статическим:

Код:
static QStringList FindDuplicates(const QStringList& inputData); 

А где имплементация? Что-то по видимому недокопировалось...

Да вроде как все скопировал. На функцию не ругается, забыл сделать ее статичной как вы написали. НО сборка все равно не проходит.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Октябрь 05, 2015, 00:44 »

Как функция заимплементирована? Что в файле MyDuplicates.cpp? Он, похоже, не полностью залился...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #13 : Октябрь 05, 2015, 01:48 »

Как функция заимплементирована? Что в файле MyDuplicates.cpp? Он, похоже, не полностью залился...

В нем ничего нету. Там должна быть реализация уже алгаритма поиска. По я еще не знаю как сделать его. Кинул просто показать что он есть но пустой.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #14 : Октябрь 05, 2015, 02:22 »

Аа, ну дык хотя бы пустышку в срр надо положить, а то не слинкуется...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 22.