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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Несколько тонких вопросов по Qt.  (Прочитано 7322 раз)
andi
Гость
« : Январь 10, 2007, 05:26 »

Постоянно сталкиваюсь с мелкими проблемами. Использую Qt 3.3.6, Linux.
1) Хочу в QTable закрасить ячейку. Есть 2 подхода:
 - пололжить на нее разукрашеный QPixmap (код довольно простой, но как оказалось картинка кладется поверх надписи, что не есть хорошо).
 - Наследоваться от QTableItem и переопределить paint (еще не пробовал, не понятно как задавать цвет. В примерах цвет жестко прописан в методе. Выход вижу в использовании дополнительного свойства в классе TableItem. Как мне кажется довольно громоздкий способ.)

Есть еще какие-то непонятки, но сейчас уже не помню.
Буду сюда по мере появления постить.
Записан
Alex03
Гость
« Ответ #1 : Январь 10, 2007, 09:20 »

Сам уже всё рассказал! Улыбающийся это я про второй способ
Цитировать

Наследоваться от QTableItem и переопределить paint...

Т.е. добавить например в QMyTableItem признак закрашивания и/или сразу QColor, и инициалилировать его в конструктора и/или отдельном методе.

В том же примере examples/table/statistics красят последнюю строку так:
Код:

void TableItem::paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected )
{
    QColorGroup g( cg );
    // last row is the sum row - we want to make it more visible by
    // using a red background
    if ( row() == table()->numRows() - 1 )
g.setColor( QColorGroup::Base, red );
    QTableItem::paint( p, g, cr, selected );
}
Записан
andi
Гость
« Ответ #2 : Январь 10, 2007, 09:43 »

Это все ясно. Непонятно вот что.
Хочу сделать закрашенную клетку. Это мне придется каждую закрашенную клетку отдельно объявлять заполнять и цеплять к таблице?
Как лучше отнаследоваться от QTable и QTableItem чтобы появилось свойство типа QColor и метод setBackgroundColor(color,row,col)
Причем так чтобы все остальное осталось попрежнему и без лишних телодвижений.
Записан
BaltikS
Гость
« Ответ #3 : Январь 10, 2007, 10:21 »

Если унаследоваться от QTable и переопределить paintCell, то унаследоваться от QTableItem необязательно! Другого способа увы нет.
Записан
andi
Гость
« Ответ #4 : Январь 10, 2007, 13:01 »

Хорошо. Тогда такой вопрос. Как устроен QTable?
Создаю я таблицу 100 на 100. В качестве ячеек сразу создаются экземпляры QTableItem?
Или они каким-то чудесным образом создаются только при записи чего либо в ячейку?
Я к тому клоню, что  цвет надо хранить в QTableItem (или его потомке), а метод для изменеия и отрисовку нужно бы приделать к QTable.
Если я правильно понимаю, то нужно наследовать их оба и еще потом как-то внутри друг на друга натравить.
Записан
BaltikS
Гость
« Ответ #5 : Январь 10, 2007, 13:09 »

Цитировать

Создаю я таблицу 100 на 100. В качестве ячеек сразу создаются экземпляры QTableItem?
Или они каким-то чудесным образом создаются только при записи чего либо в ячейку?
Первоначально итемов там нет, но при записи туду чего нибудь они автоматом создаются. Ты прав, в твоём случае, тогда надо оба класса наследовать. Но я бы лучше унаследовал только QTableItem и там всё сделал как бы сложно и громоздко не получилось!
Записан
andi
Гость
« Ответ #6 : Январь 10, 2007, 14:14 »

Я тоже к этому варианту склоняюсь. Единственно непонятно каким образом QTable узнает о моем наследнике. Смотрел примеры в бланшете (в 4 главе про электронные таблицы, они там наследовали оба класса, поглядел объем кода и стало дурно, хотя может надо просто разобраться)

добавлено спустя:

 Следующий тонкий вопрос.
2) Как сделать надпись на кнопке в 2 и более строк?
Записан
BaltikS
Гость
« Ответ #7 : Январь 10, 2007, 15:41 »

1) Делаем преобразование типов
QMyItem *my = static_cast<QMyItem*>table->item(m,n);

2) Самый простоой способ button->setText("str1\nstr2");
Ну а по-хорошему унаследуемся от QButton
Записан
Alex03
Гость
« Ответ #8 : Январь 10, 2007, 16:45 »

Цитата: "andi"

...
Единственно непонятно каким образом QTable узнает о моем наследнике.
...

void QTable::setItem ( int row, int col, QTableItem * item )
Запихиваете любого наследника.
Хоть так:
Код:

    pTabObject->setItem (row, col, new ColorTableItem(Qt::red,  pTabObject, QTableItem::Never, "bla-bla"));

При наличии соответствующего конструктора у Вашего ColorTableItem.

Цитировать

 Следующий тонкий вопрос.
2) Как сделать надпись на кнопке в 2 и более строк?


На какой кнопке?
Записан
andi
Гость
« Ответ #9 : Январь 11, 2007, 06:12 »

Надпись на QPushButton.
Чего-то про "\n" не догадался. Думаю это то что нужно, мне как раз надо по простому.

Теперь про "void QTable::setItem ( int row, int col, QTableItem * item ) "
Когда я вызываю virtual void QTable::setText ( int row, int col, const QString & text )
то, я так понимаю, setItem() вызывается где-то внутри? Если мы хотим использовать те же методы, но с нашим ColorTableItem, тогда нужно изменять эти методы (что ведет к наследованию от QTable).

Вот это место непонял:
>> 1) Делаем преобразование типов
>> QMyItem *my = static_cast<QMyItem*>table->item(m,n);

Следующий тонкий вопрос.
3) В комплексе предполагается использование touchscreen-a (сенсорная панель на монитор).
Соответственно нужно реализовать экранную клавиатуру в программе. Какие будут предложения?
Я думаю самый правильный это каким-то образом вклиниться в сигналы от клавиатуры, чтобы не следить за позицией курсора, а просто тупо куда-то отсылать коды символов.
Ну и вопрос куда их отсылать?

добавлено спустя 4 минуты:

 \n - у меня не сработал.
Записан
Alex03
Гость
« Ответ #10 : Январь 11, 2007, 08:04 »

Цитата: "andi"
Надпись на QPushButton.
Чего-то про "\n" не догадался. Думаю это то что нужно, мне как раз надо по простому.

добавлено спустя 4 минуты:

 \n - у меня не сработал.


Да всё работает

Код:

#include <qapplication.h>
#include <qpushbutton.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    QPushButton pb(NULL);
    pb.setText("This is\nmulti line\nQPushButton");
    a.setMainWidget( &pb );
    pb.show();

    return a.exec();
}



Цитировать

Теперь про "void QTable::setItem ( int row, int col, QTableItem * item ) "
Когда я вызываю virtual void QTable::setText ( int row, int col, const QString & text )
то, я так понимаю, setItem() вызывается где-то внутри? Если мы хотим использовать те же методы, но с нашим ColorTableItem, тогда нужно изменять эти методы (что ведет к наследованию от QTable).


А настолько ли это важно - использование абсолютно тех-же методов?
Если Вас не устраивает замена setText на setItem то деваться некуда. Рожайте свой QTable.

Цитировать

Вот это место непонял:
>> 1) Делаем преобразование типов
>> QMyItem *my = static_cast<QMyItem*>table->item(m,n);


Эт в книгу по Ц++.

Цитировать

Следующий тонкий вопрос.
...


ИМХО задавать кучю не связанных вопросов в одном треде не есть гуд. В том числе и потому что Вы отсекаете очень много народа от обсуждения.
Записан
andi
Гость
« Ответ #11 : Январь 11, 2007, 09:46 »

Как я заметил (не только по этому форуму), на "тонкие вопросы" обычно отвечают 1-2 знающих человека, остальные только читают.
Теперь про \n
Нашел ошибку (пытался надписи в Designere писать, а он \ заменял на \\ ).
Аналогично в лингвисте.
Записан
Alex03
Гость
« Ответ #12 : Январь 11, 2007, 12:10 »

Дык в дизайнере даблклик на кнопке и любой текст с переводом строки по ентеру. Улыбающийся

Аналогично в лингвисте. Т.е. просто Enter.
Записан
andi
Гость
« Ответ #13 : Январь 11, 2007, 13:45 »

мдя... чего то я ваще запарился Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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