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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: несколько коннектов(помочь решить вопрос)  (Прочитано 3585 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Июль 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?
Посоветуйте вообще как лучше сделать?
« Последнее редактирование: Июль 24, 2014, 19:34 от koldun90 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июль 24, 2014, 20:25 »

putpapki должно быть слотом SLOT, а не сигналом SIGNAL.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #2 : Июль 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 правых виджета) но это уж слишком кошерно поэтому прошу помощи

« Последнее редактирование: Июль 24, 2014, 21:09 от koldun90 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июль 24, 2014, 22:18 »

копипаста — это плохо. выдели этот метод в отдельный класс и сделай множественное наследование.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #4 : Июль 25, 2014, 05:16 »

Я так понял
1)убрать все коннекты
2) вызывать тупо этот метод из dropeventa
3)сделать 1 метод на все 3 класса(общий)
если допустим дропаю на тривиев то метод копирования вызывается из mytreeview::dropevent(event )
я правильно понял
тогда и получится что не будет так сказать конфликтов
Записан
s_Creator
Гость
« Ответ #5 : Июль 25, 2014, 06:07 »

имхо, копирование должна выполнять модель, т.е. в ней должен находится метод копирования который будешь вызывать из dropevent.
Тогда и не будет копи пасты и каждый будет делать свое дело.
модель работать с файловой системой а виевы отображать эту модель.
Причем метод копирования лучше сделать слотом а в виевах сигналы к нему
« Последнее редактирование: Июль 25, 2014, 06:09 от s_Creator » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #6 : Июль 25, 2014, 19:22 »

я вызываю метод копирования в dropmimedata модели
а как иначе?. Ведь только тогда  можно получить папку в которую я дропаю объекты
поэтому копирование нужно вызывать в dropmimedata
Записан
s_Creator
Гость
« Ответ #7 : Июль 25, 2014, 20:23 »

Ну так в чем вопрос?
модели не важно как вы это отображаете, ей важно что делать: т.е. слот (в моделе) должен понимать команду что и куда копировать (копировать можно либо файл в другую папку, либо файл в другую или туже но под другим именем, либо папку аналогично файлу со всем содержимым). Продумайте входные параметры слота чтоб было ему понятно (как в проводнике винды или тотал командер по F5). А Ваши представления (которые могут представлять модель как им хочется или как умеют) будут давать модели команду (сигнал) что надо произвести копирование и входными параметрами объяснят модели, что надо именно сделать (т.е. файл или папку скопировать в другую папку или с переименованием)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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