Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] Работа с гридом QTableWidget 
V
    Опции темы
gordmiand
Дата 27.3.2010, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите пож-та как при работе с этим виджетом:
1.задать размеры определенному столбцу/ строке таблицы
2.считать в переменную значение какой-либо ячейки грида
3. как задать текст для ячейки, находящейся на пересечении строки и столбца заголовков (те, что серые)?
4. запретить ввод данных в определенный столбец/строку таблицы?  

PM MAIL   Вверх
gordmiand
Дата 27.3.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с п.1 и п.3 вроде разобрался - подскажите пож- та ответы на пп. 2 и 4...!!!
PM MAIL   Вверх
SABROG
Дата 27.3.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @  27.3.2010,  01:07 Найти цитируемый пост)
считать в переменную значение какой-либо ячейки грида

Код

ui->tableWidget->item(row, col)->data(Qt::UserRole).toInt();


Цитата(gordmiand @  27.3.2010,  01:07 Найти цитируемый пост)
запретить ввод данных в определенный столбец/строку таблицы?

Код

QTableWidgetItem* item = new QTableWidgetItem(QLatin1String("Not Editable Cell"));
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
ui->tableWidget->setItem(row, col, item);


Соответственно для целой колонки нужно пробежаться по всем ячейкам или сформировать итемы в цикле. Тоже самое касается и строк.


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


Опытный
**


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

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



понятно...спасибо...

а все таки - можно ли задать текст для ячейки, находящейся на пересечении строки и столбца заголовков (те, что серые)?каким именно образом?
PM MAIL   Вверх
SABROG
Дата 28.3.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @  27.3.2010,  23:35 Найти цитируемый пост)
находящейся на пересечении строки и столбца заголовков

Код

QTableWidgetItem* itemH = new QTableWidgetItem(QLatin1String("Horizontal Header"));
ui->tableWidget->setHorizontalHeaderItem(col, itemH);
QTableWidgetItem* itemV = new QTableWidgetItem(QLatin1String("Vertical Header"));
ui->tableWidget->setVerticalHeaderItem(row, itemV);


Это сообщение отредактировал(а) SABROG - 28.3.2010, 13:09


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


Опытный
**


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

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



SABROG: а чему задавать параметр col в Вашем примере?
PM MAIL   Вверх
SABROG
Дата 28.3.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @ 28.3.2010,  12:33)
SABROG: а чему задавать параметр col в Вашем примере?

Колонке (col) или Строке (row).


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


Опытный
**


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

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



SABROG:
1. по поводу "считать в переменную значение какой-либо ячейки грида"
почему тогда код:
Код

 ui->lineEdit->setText(QString::number( ui->tableWidget->item(0, 0)->data(Qt::UserRole).toInt()    ) );

не выводит значение ячейки (0,0), введенное туда мною руками?
ввожу, допустим 10, а ответ всегда 0....как будет правильно?
2. насчет "задать текст для ячейки, находящейся на пересечении строки и столбца заголовков (те, что серые)" - я знаю что такое col и row .- чему конкретно их надо задавать, чтобы проставить текст в ячейку под знаком "?" - см. прилагаемый рисунок...

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  table.JPG 10,76 Kb
PM MAIL   Вверх
SABROG
Дата 28.3.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @  28.3.2010,  17:57 Найти цитируемый пост)
ui->lineEdit->setText(QString::number( ui->tableWidget->item(0, 0)->data(Qt::UserRole).toInt()    ) );

Потому, что ты менял не Qt::UserRole, а Qt::DisplayRole. QString::number()/toInt(), что за масло масляное? Может все-таки документацию почитаешь про роли, про тип QVariant? Я выбрал Qt::UserRole и тип int в качестве примера, которого ты так просил. Но это лишь демонстрация того, что к ячейке с текстом "Hello, Word" можно привязать почти безграничное количество своих данных любых типов: Qt::UserRole, Qt::UserRole + 1, Qt::UserRole + 2 ... Qt::UserRole + N. Чтобы получить текстовый "Hello, world!" достаточно написать:

Код

ui->lineEdit->setText(ui->tableWidget->item(0, 0)->text());


Цитата(gordmiand @  28.3.2010,  17:57 Найти цитируемый пост)
2. насчет "задать текст для ячейки, находящейся на пересечении строки и столбца заголовков (те, что серые)" - я знаю что такое col и row .- чему конкретно их надо задавать, чтобы проставить текст в ячейку под знаком "?" - см. прилагаемый рисунок...

Лучше бы сразу рисунок приложил, не пришлось бы голову ломать или написал бы "верхняя левая пустая серая ячейка в заголовке". Она называется Corner Button. Изначальная её задача выделять все ячейки как в Excel, а не быть заголовком. Если тебе нужен текст на ней, то можно воспользоваться "хаком":

Код

#include <QtGui>

class TableWidget : public QTableWidget
{
public:
    TableWidget(int rows, int cols, QWidget* parent = 0)
        : QTableWidget(rows, cols, parent)
    {
        QAbstractButton* btn = findChild<QAbstractButton*>();
        if (btn)
        {
            btn->setText("Text");
            btn->installEventFilter(this);

            // adjust the width of the vertical header to match the preferred corner button width
            // (unfortunately QAbstractButton doesn't implement any size hinting functionality)
            QStyleOptionHeader opt;
            opt.text = btn->text();
            QSize s = (btn->style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize(), btn).
                expandedTo(QApplication::globalStrut()));
            if (s.isValid())
                verticalHeader()->setMinimumWidth(s.width());
        }
    }

    bool eventFilter(QObject* o, QEvent* e)
    {
        if (e->type() == QEvent::Paint)
        {
            QAbstractButton* btn = qobject_cast<QAbstractButton*>(o);
            if (btn)
            {
                // paint by hand (borrowed from QTableCornerButton)
                QStyleOptionHeader opt;
                opt.init(btn);
                QStyle::State state = QStyle::State_None;
                if (btn->isEnabled())
                    state |= QStyle::State_Enabled;
                if (btn->isActiveWindow())
                    state |= QStyle::State_Active;
                if (btn->isDown())
                    state |= QStyle::State_Sunken;
                opt.state = state;
                opt.rect = btn->rect();
                opt.text = btn->text(); // this line is the only difference to QTableCornerButton
                opt.position = QStyleOptionHeader::OnlyOneSection;
                QStylePainter painter(btn);
                painter.drawControl(QStyle::CE_Header, opt);
                return true; // eat event
            }
        }
        return false;
    }
};

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    TableWidget t(2, 2);
    t.show();
    return a.exec();
}




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


Опытный
**


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

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



SABROG: большое спасибо за ответы....
тем не менее хотел бы Вам пояснить:
1.  "QString::number()/toInt(), что за масло масляное?"
toInt() использую, чтобы считать числовое значение из заданной ячейки грида, а QString::number() - чтобы вывести это значение в lineEdit - у него ж свойство типа string а я хочу вывечти число - соот-но и использую преобразование...
2. по п.2. -  неужели так все сложно чтобы вывести тескт в эту пресловутую ячейку? я тогда лучше в нее помещу Label и на нем напишу нужный мне текст...
и неужели "верхняя левая пустая серая ячейка в заголовке" != "ячейка, находящаяся на пересечении серых строки и столбца заголовков таблицы"? но это так, к слову...

 
PM MAIL   Вверх
SABROG
Дата 28.3.2010, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @  28.3.2010,  19:36 Найти цитируемый пост)
1.  "QString::number()/toInt(), что за масло масляное?"

Код

QVariant::toString()


Смысла нет сначала преобразовывать в int, а потом в QString. Особенно смысл пропадает, когда в QVariant может изначально QString быть помещен.

Цитата(gordmiand @  28.3.2010,  19:36 Найти цитируемый пост)
неужели так все сложно чтобы вывести тескт в эту пресловутую ячейку? я тогда лучше в нее помещу Label и на нем напишу нужный мне текст...


Это не ячейка, это кнопка. Доступ к кнопке можно получить просто:

Код

QAbstractButton* btn = findChild<QAbstractButton*>();


Но это не заставит её выводить текст потому, что для QTableWidget/View был написан собственный класс кнопки на базе QAbstractButton - QTableCornerButton. И этот класс сам себя отрисовывает и установка текста в него не предусмотрена реализацией. Если тебе удасться вместо него туда поставить QLabel нормальным способом (не поверх всех виджетов), то я бы хотел посмотреть на этот код. Мне удалось сделать это с помощью "хака", 7 строчек кода без наследований, переопределений и собственного рисования, замена указателя внутри приватных данных Qt:

user posted image


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


одинокий падаван
**


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

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



SABROG, спасибо за классный хак smile. Я таких финтов раньше не знал (действительно, большое спасибо).
Но в моём случае он не подошёл. Распишу в этой теме как свою траблу решил - и ты отревьювишь, и другим в помощь.
Мне надо было в таблицу на место корнер-баттон запихнуть свою кнопку - и что бы она себя именно как кнопка вела (без текста, но с иконкой).
Полдня плясал вокруг твоего хака - получалось не кузяво:
1. сункен для кнопки в хидере не влиял на её отображение никак.
2. размер иконки получался очень маленьким и никакие сэтИконСайз не помогали - выручала только перерисовка пиксама (дравПиксмап) иконки поверх нарисованного контроллера - очень неудобно и не красиво получалось, т.к. в пиксаме при ресайзе ухудшалось качество иконки
3. внешний вид кнопки - не соответствовал кнопке  - когда нажимаешь - картика должна смещаться чутка.
------------------
вообщем поплясал, послясал и плюнул.
решил следующим образом:
1. корнер баттон дизейблим (setCornerButtonEnabled(false))
2. создаём свой пушБаттон и длаем его плоским (flat)
3. перегружаем ресайз, где после QWidget::resize(event) задаём геометрию нашей кнопки.
В результате кнопка выглядит как родная (из-за флат) и реагирует на мышку (ховер) и на нажатие (иконка смещает и фон темнее).


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
SABROG
Дата 24.6.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(_GRIN_ @  23.6.2010,  19:00 Найти цитируемый пост)
Но в моём случае он не подошёл. Распишу в этой теме как свою траблу решил - и ты отревьювишь, и другим в помощь.
Мне надо было в таблицу на место корнер-баттон запихнуть свою кнопку - и что бы она себя именно как кнопка вела (без текста, но с иконкой).

Особо плясать не пришлось и sunken у фрейма работает (QPushButton/QToolButton/QAbstractButton и т.д. не наследуют QFrame):

user posted image

Код

#include "private/qtableview_p.h"

namespace Hack { template <class To, class From> inline To* d_ptr(From* ptr)
                 { return (To*)QObjectPrivate::get(ptr);}}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QFrame* frame = new QFrame(ui->tableWidget);
    frame->setContentsMargins(1, 1, 1 ,1);
    frame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    frame->setLineWidth(1);
    QTableViewPrivate* tvPrivate = Hack::d_ptr<QTableViewPrivate>(ui->tableWidget);
    tvPrivate->cornerWidget->deleteLater();
    tvPrivate->cornerWidget = frame;
    QGridLayout* grdLayout = new QGridLayout(frame);
    grdLayout->setContentsMargins(0, 0, 0, 0);
    QPushButton* btn = new QPushButton(
            QIcon(QLatin1String(
                    ":/trolltech/qmessagebox/images/qtlogo-64.png"
                    )), 0);
    btn->setFlat(true);
    grdLayout->addWidget(btn);
}




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


одинокий падаван
**


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

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



SABROG, круто, спасибо большое smile
я тебе даже больше скажу - ты мне глаза открыл, на использование закрытых кьютишных классов - и чё я их раньше не юзал smile))
огроменнное спасибо за науку

Это сообщение отредактировал(а) _GRIN_ - 24.6.2010, 11:17


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

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

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


 




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


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

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