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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Виджет выбора количества строк и столбцов в таблице  (Прочитано 3547 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Июнь 27, 2013, 16:41 »

Здравствуйте )
Собственно, сабж )
Виджет то сделал, вот только с алгоритмом определения строки и столбца не могу справиться - не правильно определяет Грустный Скрин проблемы прилагается )

Код:
class foo: public QWidget
{
    Q_OBJECT

public:
    foo(QWidget *parent = 0)
        : QWidget(parent)
    {
        size = 20;
        indent = 5;

        rowCount = 8;
        columnCount = 7;

        int width = (indent + size) * columnCount + indent;
        int height = (indent + size) * rowCount + indent;

        setFixedSize(width, height);

        setMouseTracking(true);

        selectedRow = -1;
        selectedColumn = -1;
    }

private:
    int rowCount;
    int columnCount;
    float indent;
    float size;

    int selectedRow;
    int selectedColumn;

protected:
    void mouseMoveEvent(QMouseEvent *event)
    {
        int x = event->pos().x();
        int y = event->pos().y();

        selectedColumn = x / size;
        selectedRow = y / size;

        if(selectedColumn <= 0)
            selectedColumn = 1;

        if(selectedRow <= 0)
            selectedRow = 1;

        if(selectedColumn > columnCount)
            selectedColumn = columnCount;

        if(selectedRow > rowCount)
            selectedRow = rowCount;

        setWindowTitle(QString("%1x%2")
                       .arg(selectedColumn)
                       .arg(selectedRow));

        update();
    }

    void paintEvent(QPaintEvent *)
    {
        QPainter painter(this);

        QPen pen;

        // Отрисуем основную таблицу
        pen.setColor(Qt::darkGray);
        painter.setPen(pen);

        for(int column = 0; column < columnCount; column++)
        {
            int x = (indent + size) * column + indent;

            for(int row = 0; row < rowCount; row++)
            {
                int y = (indent + size) * row + indent;
                painter.drawRect(x, y, size, size);
            }
        }


        // Отрисуем поверх основной таблицы, таблицу выделенную мышкой
        pen.setColor(QColor("#7CFC00"));
        pen.setJoinStyle(Qt::RoundJoin);
        pen.setWidthF(2.0);

        painter.setPen(pen);

        for(int column = 0; column < selectedColumn; column++)
        {
            int x = (indent + size) * column + indent;

            for(int row = 0; row < selectedRow; row++)
            {
                int y = (indent + size) * row + indent;

                painter.save();
                painter.setBrush(Qt::white);
                float factor = 1.5;
                painter.drawRect(x - factor, y - factor,
                                 size + factor, size + factor);
                painter.restore();
            }
        }
    }
};
« Последнее редактирование: Июль 24, 2013, 16:48 от gil9red » Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июнь 27, 2013, 16:58 »

При расчете выбранных ячеек не учитывается ident.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июнь 27, 2013, 17:10 »

Да, знаю - забыл написать Строит глазки
а как изменить алгоритм, чтобы был учет отступа (indent) Непонимающий
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июнь 27, 2013, 17:15 »

Да, знаю - забыл написать Строит глазки
а как изменить алгоритм, чтобы был учет отступа (indent) Непонимающий
Вы делите координату на size, а нужно на size+indent.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Июнь 27, 2013, 17:19 »

Точно! Веселый
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июнь 27, 2013, 17:31 »

Точно! Веселый
Можно легко все рисовать не в два прохода, а в один.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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