Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Июль 24, 2014, 18:57



Название: несколько коннектов(помочь решить вопрос)
Отправлено: koldun90 от Июль 24, 2014, 18:57
проблема в следующем есть коннекты:
Код:
  connect(model1,SIGNAL(poluchinf(QString)),ui->treeView,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->treeView_2,SIGNAL(putpapki(QString)));

   connect(model1,SIGNAL(poluchinf(QString)),ui->tableview,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->tableView_2,SIGNAL(putpapki(QString)));

    connect(model1,SIGNAL(poluchinf(QString)),ui->listView_3,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->listView_4,SIGNAL(putpapki(QString)));

суть в том когда допустим model1 испускает сигнал она передает путь куда дропается файл или папка
Код:
bool myqfilesystemmodel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    QString str=fileInfo(parent).absoluteFilePath();
    emit poluchinf(str);
    return true;
}
а затем после испускания сигнала выполняется метод который копирует файлы или папки при драг дропе..
проблема в том заключается что слот должен вызываться допустим если я дропаю на тривиев(дерево) то метод копирования вызываться должен только
Код:
connect(model1,SIGNAL(poluchinf(QString)),ui->treeView,SIGNAL(putpapki(QString)));
но происходит так сначало вызвается  этот слот а потом еще два слота.
ТО я дропаю на тривиев а вызываются слоты еще и на тейблвиев и на листвиев

Код:
connect(model1,SIGNAL(poluchinf(QString)),ui->tableview,SIGNAL(putpapki(QString)));
connect(model1,SIGNAL(poluchinf(QString)),ui->listView_3,SIGNAL(putpapki(QString)));

так вот нельзя мне сделать как нибудь так что бы вызывался слот в соответствии с тем на какой я дропаю элемент(тривиев листвиев или тейблвиев)
Можно выполнить проверку над каким элементом находится курсор мыши в dropMimeData?
Посоветуйте вообще как лучше сделать?


Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: kambala от Июль 24, 2014, 20:25
putpapki должно быть слотом SLOT, а не сигналом SIGNAL.

а putpapki точно определен в классах-наследниках твоих отображений? может правильнее this ставить 3-м параметром?


Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: koldun90 от Июль 24, 2014, 20:58
в общем вот так вот полная картина
Код:

connect(model1,SIGNAL(poluchinf(QString)),ui->treeView,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->treeView_2,SIGNAL(putpapki(QString)));

    connect(model1,SIGNAL(poluchinf(QString)),ui->tableView,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->tableView_2,SIGNAL(putpapki(QString)));

    connect(model1,SIGNAL(poluchinf(QString)),ui->listView_3,SIGNAL(putpapki(QString)));
    connect(model2,SIGNAL(poluchinf(QString)),ui->listView_4,SIGNAL(putpapki(QString)));



    //
    connect(ui->treeView,SIGNAL(putpapki(QString)),ui->treeView,SLOT(copirovanie(QString)));
    connect(ui->treeView_2,SIGNAL(putpapki(QString)),ui->treeView_2,SLOT(copirovanie(QString)));

    connect(ui->listView_3,SIGNAL(putpapki(QString)),ui->listView_3,SLOT(copirovanie(QString)));
    connect(ui->listView_4,SIGNAL(putpapki(QString)),ui->listView_4,SLOT(copirovanie(QString)));

    connect(ui->tableView,SIGNAL(putpapki(QString)),ui->tableView,SLOT(copirovanie(QString)));
    connect(ui->tableView_2,SIGNAL(putpapki(QString)),ui->tableView_2,SLOT(copirovanie(QString)));


mytreeview класс
Код:
void mytreeview::copirovanie(QString putpapki)    //putpapki-------���� ���������� �����������  ���������� ����� dropmimedata
{
    if (!putpapki.isNull())   //���� �� ���� ���� ���� ���������� ������
    {

        for (int i=0;i<spisok2.size();i++)   //�������� ���������� ��� ���� ������� �� ���������� ����������
        {
            if (spisok2[i]!=putpapki) //���� ����� spisok2[i] ����� ����� putpapki(���� �������� ����� � ������� �����) ����� ������ ������
            {
                if (QFileInfo(spisok2[i]).isFile())
                {
                    QString basename=QFileInfo(spisok2[i]).fileName();
                    QFile::copy(spisok2[i],putpapki+"/"+basename);
                }
                if (QFileInfo(spisok2[i]).isDir())
                {
                    QString imypapki=QFileInfo(spisok2[i]).fileName();
                    QString kudakop=putpapki+"/"+imypapki;
//                    QMessageBox msg;
//                    msg.setText("KOIRUEM "+spisok2[i]);
//                    msg.exec();
//                    msg.setText("VSTAVLYAEM  "+kudakop);
//                    msg.exec();
                    emit kopirovpapki(spisok2[i],kudakop,1);
                    kudakop.clear();
                }
            }
        }
        emit sg2(2,0);    //����� ����������� �������� ������ �� ��������� ��������
        spisok2.clear();
    }

}

mylistview.cpp
Код:
void mylistview::copirovanie(QString putpapki)    //putpapki-------���� ���������� �����������  ���������� ����� dropmimedata
{
    if (!putpapki.isNull())   //���� �� ���� ���� ���� ���������� ������
    {

        for (int i=0;i<spisok2.size();i++)   //�������� ���������� ��� ���� ������� �� ���������� ����������
        {
            if (spisok2[i]!=putpapki) //���� ����� spisok2[i] ����� ����� putpapki(���� �������� ����� � ������� �����) ����� ������ ������
            {
                if (QFileInfo(spisok2[i]).isFile())
                {
                    QString basename=QFileInfo(spisok2[i]).fileName();
                    QFile::copy(spisok2[i],putpapki+"/"+basename);
                }
                if (QFileInfo(spisok2[i]).isDir())
                {
                    QString imypapki=QFileInfo(spisok2[i]).fileName();
                    QString kudakop=putpapki+"/"+imypapki;
//                    QMessageBox msg;
//                    msg.setText("KOIRUEM "+spisok2[i]);
//                    msg.exec();
//                    msg.setText("VSTAVLYAEM  "+kudakop);
//                    msg.exec();
                    emit kopirovpapki(spisok2[i],kudakop,1);
                    kudakop.clear();
                }
            }
        }
        emit sg2(2,0);    //����� ����������� �������� ������ �� ��������� ��������
        spisok2.clear();
    }

}
mytableview.cpp
Код:
void mytableview::copirovanie(QString putpapki)    //putpapki-------���� ���������� �����������  ���������� ����� dropmimedata
{
    if (!putpapki.isNull())   //���� �� ���� ���� ���� ���������� ������
    {

        for (int i=0;i<spisok2.size();i++)   //�������� ���������� ��� ���� ������� �� ���������� ����������
        {
            if (spisok2[i]!=putpapki) //���� ����� spisok2[i] ����� ����� putpapki(���� �������� ����� � ������� �����) ����� ������ ������
            {
                if (QFileInfo(spisok2[i]).isFile())
                {
                    QString basename=QFileInfo(spisok2[i]).fileName();
                    QFile::copy(spisok2[i],putpapki+"/"+basename);
                }
                if (QFileInfo(spisok2[i]).isDir())
                {
                    QString imypapki=QFileInfo(spisok2[i]).fileName();
                    QString kudakop=putpapki+"/"+imypapki;
//                    QMessageBox msg;
//                    msg.setText("KOIRUEM "+spisok2[i]);
//                    msg.exec();
//                    msg.setText("VSTAVLYAEM  "+kudakop);
//                    msg.exec();
                    emit kopirovpapki(spisok2[i],kudakop,1);
                    kudakop.clear();
                }
            }
        }
        emit sg2(2,0);    //����� ����������� �������� ������ �� ��������� ��������
        spisok2.clear();
    }

}

ВООБЩЕМ СМЫСЛ ТАКОЙ что я дропаю на тейблвиев допустим ,а выполняются у меня все три метода и тейбл виев и листвиеве и тривиев
как сделать так чтобы при дропе допустим на тейблвиев (активировался метод копирования только на тейблвиеве)

ps метод у всех классов(mytreeview mylistview mytableview наследников одинаковый (всмысле код и функционал)

файл менеджер имеется  6 окон
3 левых окна и 3 правых
поначалу отображается окна
тейблвиев тейблвиев
model1--модель файловой системы в 3  левых окнах
model2-- модель файловой системы в 3 правых окнах

вот и смысл втом блин что при вызове копиорования slot (copirovanie)
 он начинает поочередно выполнять всем методы копирования( не зависимо куда я дропаю) а должен выполнять только один метод( допустим дропую на тейблвиев и выполняется метод ТОЛЬКО который в тейблвиев)
а сейчас пока выполняютсявсе поочередно 3 метода

КОНЕчНО МОЖНО РЕШИТЬ ЭТОТ ВОПРОС взять и тупо сделать ( model1, model2,model3,model4,model5,model6) 6 моделей на каждый виджет по модели ( а у меня пока одна модель на 3 левых и одна на 3 правых виджета) но это уж слишком кошерно поэтому прошу помощи



Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: kambala от Июль 24, 2014, 22:18
копипаста — это плохо. выдели этот метод в отдельный класс и сделай множественное наследование.

6 моделей — это неправильно конечно (как, в общем, и две). посмотри в сторону *View::dropEvent и оттуда просто вызывай свой метод вместо высылки сигнала из модели.


Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: koldun90 от Июль 25, 2014, 05:16
Я так понял
1)убрать все коннекты
2) вызывать тупо этот метод из dropeventa
3)сделать 1 метод на все 3 класса(общий)
если допустим дропаю на тривиев то метод копирования вызывается из mytreeview::dropevent(event )
я правильно понял
тогда и получится что не будет так сказать конфликтов


Название: Re: несколько коннектов(помочь решить вопро&#
Отправлено: s_Creator от Июль 25, 2014, 06:07
имхо, копирование должна выполнять модель, т.е. в ней должен находится метод копирования который будешь вызывать из dropevent.
Тогда и не будет копи пасты и каждый будет делать свое дело.
модель работать с файловой системой а виевы отображать эту модель.
Причем метод копирования лучше сделать слотом а в виевах сигналы к нему


Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: koldun90 от Июль 25, 2014, 19:22
я вызываю метод копирования в dropmimedata модели
а как иначе?. Ведь только тогда  можно получить папку в которую я дропаю объекты
поэтому копирование нужно вызывать в dropmimedata


Название: Re: несколько коннектов(помочь решить вопрос)
Отправлено: s_Creator от Июль 25, 2014, 20:23
Ну так в чем вопрос?
модели не важно как вы это отображаете, ей важно что делать: т.е. слот (в моделе) должен понимать команду что и куда копировать (копировать можно либо файл в другую папку, либо файл в другую или туже но под другим именем, либо папку аналогично файлу со всем содержимым). Продумайте входные параметры слота чтоб было ему понятно (как в проводнике винды или тотал командер по F5). А Ваши представления (которые могут представлять модель как им хочется или как умеют) будут давать модели команду (сигнал) что надо произвести копирование и входными параметрами объяснят модели, что надо именно сделать (т.е. файл или папку скопировать в другую папку или с переименованием)