Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] QtableView выделение всей строки, и получение текущей позиции курсора  
:(
    Опции темы
Programister0
Дата 4.12.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



да все отлично работает, 
но вообще непонимаю как,
 и откуда это все берется вот 
currentChanged была в Protected Slots а здесь её используем как SIGNAL 
нигде о такой возможности в Assisten'те не написано, какие ещё функции можно использовать как сигналы? как это определить?

Это сообщение отредактировал(а) Programister0 - 5.12.2007, 02:53
PM MAIL WWW ICQ Skype   Вверх
SABROG
Дата 5.12.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я так понимаю разница в том, что производному классу доступны protected методы, а в connect не происходит прямого доступа к защищенному методу, только лишь его описание, прототип. Вызов защищенного слота происходит уже внутри класса (как и положено) QTableView/Widget.

Цитата

Private(частный) раздел описания класса обычно находится вначале описания класса и содержит данные, доступ к которым закрыт из внешнего мира. Это и есть та самая "строго охраняемая" зона класса, доступ к которой можно получить только из методов самого класса. Она скрыта от внешнего мира глухой непробиваемой стеной и доступ к данным раздела private обеспечивается только с помощью, специально описанных в других разделах, методов. Скрытые в этом разделе данные также не доступны для всех производных классов.


Цитата

Protected(защищенный) - раздел описания класса содержит данные и методы, доступ к которым закрыт из внешней среды, но они напрямую доступны производным классам.

Таким образом, раздел protected используется для описания данных и методов, которые будут доступны только из производных классов. А в производных классах эти данные и методы воспринимаются, как если бы они были описаны в самом производном классе. 



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 5.12.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



SABROG, да при чём тут private/protected smile. Если ты не сделал сигнала, то сигналов никаких не будет. Сигналов никто не делал, но они откуда-то берутся. Вопрос: откуда?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 5.12.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Дык уже ответили человеку тут

Не надо путать сигналы со слотами. Сигналы "испускают" сами классы, нам не надо их звать, они сами придут. А чтобы мы узнали о их приходе нам надо повесить на дверь звонок в виде слота. А то уйдет сигнал вместе с бутылкой пива (параметром) так и не услышанным.

Собственноручно сигналы надо писать только в том случае, если создаем новый класс или модифицируем старый так, чтобы он сообщал о каком-то новом действии, которого не реализовали. Например для QLineEdit можно придумать сигнал, который прийдет если текстовое поле стало пустым, чтобы сделать неактивной кнопку "OK", если продолжение программы невозможно без ввода каких-нибудь данных, скажем серийного кода. Правда пример не очень хороший, т.к. сигнала textChanged вполне хватит на проверку пустоты.

Чтобы не быть голословным, пример на базе класс QItemSelectionModel. Класс испускает сигнал currentChanged, если удаляет, вставляет строки и т.д.

Код

void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &parent,
                                                         int start, int end)
{
    Q_Q(QItemSelectionModel);

    // update current index
    if (currentIndex.isValid() && parent == currentIndex.parent()
        && currentIndex.row() >= start && currentIndex.row() <= end) {
        QModelIndex old = currentIndex;
        if (start > 0) // there are rows left above the change
            currentIndex = model->index(start - 1, old.column(), parent);
        else if (model && end < model->rowCount(parent) - 1) // there are rows left below the change
            currentIndex = model->index(end + 1, old.column(), parent);
        else // there are no rows left in the table
            currentIndex = QModelIndex();


// посылаем СИГНАЛ !
emit q->currentChanged(currentIndex, old);
//------------------------------------------


        emit q->currentRowChanged(currentIndex, old);
        if (currentIndex.column() != old.column())
            emit q->currentColumnChanged(currentIndex, old);
    }
    // update selectionsx
    QModelIndex tl = model->index(start, 0, parent);
    QModelIndex br = model->index(end, model->columnCount(parent) - 1, parent);
    q->select(QItemSelection(tl, br), QItemSelectionModel::Deselect);
    finalize();
}


Это сообщение отредактировал(а) SABROG - 5.12.2007, 16:08


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 5.12.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



SABROG, Вы, скорее всего, не совсем верно меня поняли, или, может быть, читали ветку через строку smile.

Цитата(SABROG @  5.12.2007,  15:39 Найти цитируемый пост)
Не надо путать сигналы со слотами.

Да я то, к слову, и не путаю - потому мне и не понятна сложившаяся ситуация smile.

Цитата(SABROG @  5.12.2007,  15:39 Найти цитируемый пост)
Сигналы "испускают" сами классы, нам не надо их звать, они сами придут. 

Да. Только маленькая поправочка, а точнее две:
1. сигналы испускают не классы, а объекты.
2. они испускают только сигналы, зарегестрированные в метаобъектной системе Qt.


SABROG, хорошо, теперь скажите мне на основании всего что Вы написали, откуда в этом классе взялся сигнал currentChanged?
Обратите внимание:
1. Речь о классе QTableView.
2. В классе QTableView нет сигнала currentChanged.
3. Programister0 выкинул из моего примера строки:
Цитата(archimed7592 @  2.12.2007,  20:44 Найти цитируемый пост)
signals:
    void currentChanged( const QModelIndex & current, const QModelIndex & previous );
т.е. сигнала как не было, так, он и не появился, ибо в метаобъектной системе его никто не зарегестрировал.
4. Ему якобы удалось соеденить с несуществующим сигналом какой-то слот и, якобы, он работает:
Цитата(Programister0 @  3.12.2007,  11:03 Найти цитируемый пост)
connect(MyTable,
          SIGNAL( currentChanged( const QModelIndex &, const QModelIndex &) ),
          this,
          SLOT( itemChange ( const QModelIndex &, const QModelIndex &) )
          );


Собственно, если поверить Programister0 на слово и выкинуть из 4-го пункта слова "якобы", то получается нечто, мне не понятное.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 5.12.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Под ООП в С++ я всегда подразумевал классы. Т.е. объектно ориентированное программирование - объект = класс.
Ну тогда стоит еще одно уточнение сделать, каждый объект на базе класса QObject. А таких там большинство.

Слот currentChanged там есть. А вот сигнала я такого тоже не нашел. Либо у него на самом деле ничего не работает, либо у нас разные версии Qt ;)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 5.12.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Что ж, раз по делу сказать нечего, то могу только лишь порекомендовать в будущем читать топики внимательней, особенно, если собираетесь  в них отвечать smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 5.12.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Пока автор не выложит исходники конечного рабочего варианта гадать бессмысленно. Но я так понял он нашел для себя ответ и тема ему больше не интересна.

Если смотреть исходный код QAbstractItemView (базовый класс для QTableView), то переопределенный currentChanged слот начнет срабатывать после вызова setModel.
И тогда этот код будет рабочим без определения своего сигнала в таком виде:

Код

class MyTableView
    :    public QTableView
{
    Q_OBJECT
public:
    MyTableView(QWidget *parent = 0)
        :    QTableView(parent)
    { }
    
protected slots:
    void currentChanged( const QModelIndex & current, const QModelIndex & previous )
    { 
/*
блок для действий
*/
QTableView::currentChanged(current, previous); // зовем оригинальный обработчик/слот
}
};



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Programister0
Дата 5.12.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



Цитата

Но я так понял он нашел для себя ответ и тема ему больше не интересна

эта тема мне ещё интересна, 
я пока непонимаю откуда берутся сигналы типа: currentChanged, и
Цитата

какие ещё функции можно использовать как сигналы


Цитата

Пока автор не выложит исходники конечного рабочего варианта гадать бессмысленно

это в самом начале написал archimed7592 и оно работает хоть он в это и не верит: 
Код

#ifndef __myQTableView_H__
#define __myQTableView_H__

#include <QtGui/QTableView>

class myQTableView:
      public QTableView
{
    Q_OBJECT
  public:
    myQTableView(QWidget *parent = 0)
      :QTableView(parent)
    { }

  signals:
    void currentChanged( const QModelIndex & current, const QModelIndex & previous );

  protected slots:
  /* эти строки я выкинул т.к. компилятор отрицал возможность их компиляции
    void currentChanged( const QModelIndex & current, const QModelIndex & previous )
    { 
      QTableView::currentChanged(current, previous); 
      emit currentChanged(current, previous); 
    }
  */
};

//теперь я вставляю эту строку везде перед определением 
//Ui_* класса с QtableView 
#define QTableView  myQTableView   
//и эту в конце определения
#undef QTableView

#endif // __myQTableView_H__

далее в своих производных от Ui_* классах прописываю коннект:
Код

  connect(myTable1,  //экземпляр класса myQTableView
          SIGNAL( currentChanged( const QModelIndex &, const QModelIndex &) ),
          this,
          SLOT( myTable1Change ( const QModelIndex &, const QModelIndex &) )
          );
 
и myTable1Change - срабатывает как только меняется тек-я поз-я курсора!

Это сообщение отредактировал(а) Programister0 - 5.12.2007, 23:40
PM MAIL WWW ICQ Skype   Вверх
archimed7592
Дата 6.12.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Цитата(SABROG @  5.12.2007,  19:49 Найти цитируемый пост)
И тогда этот код будет рабочим без определения своего сигнала в таком виде:

Вообще говоря, идея заключалась как раз таки в том, чтобы добавить сигнал и забыть о слове "наследование", а никак не наоборот.

Цитата(Programister0 @  5.12.2007,  23:39 Найти цитируемый пост)
/* эти строки я выкинул т.к. компилятор отрицал возможность их компиляции

А чуть выше ты говорил про совсем другие строки. Что ж... Теперь всё понятно smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 6.12.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



"Безнаследственный" вариант я написал на первой странице. А вот кто пускает сигнал currecntChanged я так и не понял, если его нет в производных классах и он не переопределяется.
Если только каким-то странным образом слот currentChanged не превратился в сигнал.

Это сообщение отредактировал(а) SABROG - 6.12.2007, 16:43


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 6.12.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Цитата(SABROG @  6.12.2007,  16:42 Найти цитируемый пост)
Если только каким-то странным образом слот currentChanged не превратился в сигнал.

Так и есть smile. Не знаю только, насколько документированно такое поведение...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 9.12.2007, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(archimed7592 @  6.12.2007,  17:08 Найти цитируемый пост)
Так и есть

Только это идеологически нехорошо smile Родительскую реализацию мокосгенрированные сигналы не вызывают. Да и плюс - вообщем-то что, конкретно есть реализация сигнала - никак не документируется, а про emit сказано лишь, что

Цитата

The C++ preprocessor changes or removes the signals, slots, and emit keywords


С точки зрения прямого чтения доков (о, как!) - возможно и первое smile

Наиболее правильный вариант - называть сигнал по-другому...

Другой вариант (решает проблему 1, но никак не 2  smile ) - вручную написать реализацию сигнала (как простого протектед-метода) и объект метаинформации. Если возьмётесь за этот вариант - минздрав предупреждал... 


--------------------
PM MAIL ICQ Skype   Вверх
Mnior
Дата 11.1.2008, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



Прикольный баг, перенести функцию из slot в signal smile А если где-то и signal в slot  ... а потом ищи, чё это вызов сигнала зациклился, когдась всё вроде логично и не зацикленно, хотя на токое нарваться невероятно.

Интересно, а что если после переноса в сигналы сделать енто:
Код
connect(  //экземпляр класса myQTableView
                     this , SIGNAL( currentChanged( const QModelIndex &, const QModelIndex &) ),
        ((QTableView)this), SLOT  ( currentChanged( const QModelIndex &, const QModelIndex &) ) );
 smile

Да и вообще эта вся метаструктура в QT контролирует, что подаётся в slot() и signal(), а может там обыкновена функция и даже может и не бублик?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.