Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PavelVX от Май 28, 2012, 08:57



Название: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 28, 2012, 08:57
Заранее извиняюсь за возможно неправильную терминологию и криво составленный вопрос.
Есть виджет, в какой-то момент нужно создать собственное диалоговое окно с QTableView. Как мне у этого QTableView, на ходу, переопределить метод data(хочу в зависимости от данных отрисовывать по разному строки)???

Код:
//мой метод
        QDialog dlg;
        dlg.setWindowTitle("Расклад: ");
        dlg.setMinimumWidth(600);
        QTableView * tblView = new QTableView(&dlg);
//тут переопределить tblView::data

//далее по плану



Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 28, 2012, 09:19
TableView не трогай.

Трогать нужно делегаты. По 1 на каждый тип данных, или 1 общий.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 28, 2012, 09:36
Если честно, то не понял. Зачем мне делегаты для разового редактирования таблицы?


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Kurles от Май 28, 2012, 10:00
Код:
//мой метод
         //...
        QTableView * tblView = new QTableView(&dlg);
//тут переопределить tblView::data

//далее по плану

А есть такой метод в QTableView-то вообще? На лету переопределить нельзя, только наследованием и переопределением
Код
C++ (Qt)
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
в модели.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 28, 2012, 10:09
Разовое редактирование таблицы? Как же я сразу не догадался. И статичное наверно? КОНЕЧНО ЖЕ.

Это же всё написано в самом первом сообщении, да так подробно!!!

Ну тогда конечно же бери Paint, рисуй там нужную картинку с таблицей и в нужный момент просто показывай пользователю!!!


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 28, 2012, 10:54
С data у QTableView был не прав :( У модели для данного вью надо было.
То-есть, если я правильно понял аналогию, то для виджета, который будет принимать drop из drug/drop нужно писать наследника и там переопределять нужные методы?


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 28, 2012, 12:17
Да, ты прав, нооооо...

Сначала лучше объясни, что ты хочешь сделать.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: kambala от Май 28, 2012, 16:11
откуда у всех такая нелюбовь к наследованию? как будто это что-то плохое.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Пантер от Май 28, 2012, 16:13
откуда у всех такая нелюбовь к наследованию? как будто это что-то плохое.
Если наследования можно избежать, то лучше его не использовать.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 06:19

Автор: kambala
Цитата
откуда у всех такая нелюбовь к наследованию? как будто это что-то плохое.

Это не нелюбовь, это здравый смысл. Зачем мне плодить класс ради разового использования? Я понимаю, когда класс будет использоваться переодически, но если мне нужно диалоговое окно с выводом табличной части - плодить классы я не буду.

Автор: Bepec
Цитата
Да, ты прав, нооооо...
Сначала лучше объясни, что ты хочешь сделать.

Есть уже два случая, когда бы я не писал наследника, а переопределил методы находу. И думаю это только начало. :)
1. С чего вопрос и возник: диалоговое окно с таблицей, у которой нужно раскрасить красным критические значение. Делается через переопределение метода data в модели. Писать наследника для этого нехотелось бы.
2. Драг_дроп на контрол. Есть QListView с элементами, по которым будет компоноваться фильтр. На этот лист элементы фильтра перетаскиваются мышкой(драг_дроп). Тут 50/50. Можно и наследника сделать, заодно и в конструкторе поопределять все нужные переменные. Но можно и на ходу переопределить методы и реакции.
Как-то так. Но в первом случае - наследник это точно сильно круто.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Пантер от Май 29, 2012, 09:19
1. Делаешь своего делегата и в нем красишь.
2. Чем стандартное поведение не устраивает?


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 09:50
1. Зачем городить делегата-то? Я помимо раскраски еще и редактировать могу.
2. а dropEvent(QDropEvent *event) вы как будете разбирать переданный элемент? Да и в остальных подобных методах нужны проверки.
Я или запутался или понять не могу.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Пантер от Май 29, 2012, 09:53
1. И? Делегат тебе не запрещает редактировать.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 29, 2012, 10:09
Походу Павел запутался ;)

Ты можешь делать драг & дроп своих данных.

Ты можешь делегатом раскрашивать всё что движется.



Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 10:10
Но делегата-то все равно придется создавать или переопределять из имеющихся, а в нем уже делать раскраску. Я правильно понимаю?
Если применить это к реалиям, то в черновом раскладе покажите, как мне это сделать? (я правда запутался, и не могу понять, зачем тут делать делегат)
Код:

        QDialog dlg;
        dlg.setWindowTitle("Критические значения: ");
        dlg.setMinimumWidth(600);
        QTableView * tblView = new QTableView(&dlg);
        SpecTableModel * modelCrit = new SpecTableModel(&dlg); //наследник от стандартной модели со своими прибабахами
        modelCrit->setTable("tbl(col=3)");
        tblView->setModel(modelCrit);
        tblView->setAlternatingRowColors(true);
        modelCrit->select();

/*раскидывание по диалогу остальных элементов*/
        dlg.exec();

        if (dlg.result())
        {
.......
Вот и весь код. Я тут же и хотел data переопределить для раскраски. Как вы предлагаете тут использовать делегата?


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 10:15
Есть форма, на ней 2 виджета: QListWidget1, QListWidget2.
Хочу сделать перетаскивание с 1 на 2. Для этого мне необходимо в QListWidget2 переопределить методы. Я сделал наследника так:
Код:
class listViewForDrop: public QListWidget
{
        Q_OBJECT;

public:
        listViewForDrop(QWidget *widget = 0);
        ~listViewForDrop();

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);

};

/*реализация*/

void listViewForDrop::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
    {
//        event->setDropAction(Qt::MoveAction);
        event->setDropAction(Qt::CopyAction); /*пока так, но вообще надо сделать именно перенос*/
        event->accept();

    } else {
        event->ignore();
    }
}

Но, если я вас правильно понимаю, то вы утверждаете, что можно и не делать наследника и все будет работать? Но как? Я вот именно этот момент и не могу понять, если я не перепишу эти 4 класса, у меня не будет приема!


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 29, 2012, 10:24
Конечно я сейчас предложу фееричный костыль.(см. мою подпись)

Что тебе мешает производить драг & дроп на основной форме? Что мешает сделать основной виджет посредником между view? :)

Если уж дойти до страаааашной системы, то так вообще можно намутить дофига всего ;)


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 10:38
Мешает отсутствие простоты ... :)


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Kurles от Май 29, 2012, 10:53
Код
C++ (Qt)
SpecTableModel * modelCrit = new SpecTableModel(&dlg); //наследник от стандартной модели со своими прибабахами
У тебя уже есть отнаследованный класс - вот в нем и переопределяй все эти даты и дропевенты, благо модель всё это поддерживает, если только тебе посимвольной расскраски не надо, хотя и ее можно с оперделенной долей извращения :)


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: PavelVX от Май 29, 2012, 11:45
Эхх, елы палы .....
Это ГЛОБАЛЬНЫЙ КЛАСС! В серьезных формах я его наследую и переопределяю только data.
Тут смысла нет делать наследование.


Название: Re: Как прописать метод дочернего объекта в родительском классе?
Отправлено: Bepec от Май 29, 2012, 12:17
Павел, помоему вы бредите. У вас уже есть наследование, в других частях проекта у вас аналогичное наследование и тут вы заявляете - МНЕ НЕ НУЖНО НАСЛЕДОВАНИЕ! АРРРРРРрррРРррРРрр...

PS no comments...