Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145

Как избавиться от "движения" элементов внутри QTableWidget?

11.02.2023, 14:43. Показов 1173. Ответов 7
Метки qt (Все метки)

Студворк — интернет-сервис помощи студентам
Задача в университете написать крестики нолики против нейронки, пока занимаюсь интерфейсом, сделал QTableWidget, добавил в него 9 элементов пустых. Появилась такая проблема, при нажатии или, грубо говоря, когда выбраны боковые элементы (особенно заметно если удерживать мышку и по всем элементам водить) - некоторые клетки таблицы то уменьшаются, то увеличиваются, таблица "ёрзает" - выглядит это всё некрасиво.

пример в видео: https://www.youtube.com/watch?v=xPApoNfueRI

Кода как такового пока нет, я просто меняю текст элемента в таблице на х и 0 исходя из некоторой логики. Тут именно что-то с настройкой самого QTableWidget, может с настройкой самих итемов QTableWidgetItem, которыми я заполнил таблицу, не знаю. Подскажите, пожалуйста)



И какие у вас еще варианты есть, как можно реализовать интерфейс крестиков-ноликов на виджетах?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2023, 14:43
Ответы с готовыми решениями:

Как избавиться от иероглифов? код внутри
Вроде бы все норм. Только выводит иероглифы. Как от них избавиться? Программа должна выводить строку. Заголовочный файл include...

Как избавиться от падений двухколёсного транспорта на бок? Для движения используются wheel коллайдеры
Двухколёсный транспорт (по типу велосипеда), само собой, падает на бок. Как реализовать "балансирование", чтобы хотя бы во время...

Как избавиться от ошибки, возникшей в Android Studio (подробности внутри)?
Как решить эту проблему? Rendering Problems: Failed to load the LayoutLib: com/android/layoutlib/bridge/Bridge : Unsupported...

7
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.02.2023, 19:34
А какой размер у таблицы? Число делится на 3 без остатка?
1
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
11.02.2023, 19:43  [ТС]
Croessmah, какой именно размер? если про вот это, то вроде бы делится, но не уверен


P.S., выставил размер строки и столбца 102, кратное 3, а общий размер получился 306, но безуспешно

хмм, я уменьшил размер строк и столбцов как 90 и проблема исчезла, видимо проблема в том, что я ограничил размер самого виджета как "300" (из расчёта 100 * 3), видимо надо больше ставить)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.02.2023, 19:56
Попробуйте еще autoScroll выключить, если включен.
1
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
11.02.2023, 21:12
Цитата Сообщение от PrOsTo_NiK_ Посмотреть сообщение
И какие у вас еще варианты есть, как можно реализовать интерфейс крестиков-ноликов на виджетах
QGridLayout c кнопками, QGraphicsScene, paintEwent()

На простом виджете, в paintEwent()
2
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
11.02.2023, 21:31  [ТС]
sdf45, Выглядит интересно, а можно поподробнее про пример, который на гифке у Вас?
0
Покинул чат.
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,379
11.02.2023, 22:12
Цитата Сообщение от PrOsTo_NiK_ Посмотреть сообщение
поподробнее про пример
Да простая дэмка для гифки-квадратная матрица, логику самой игры не прикручивал.

Кликните здесь для просмотра всего текста


//setCentralWidget( new Board(matrixSize) );

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
 
class Board : public QWidget
{
private:
    enum class Figure{O, X, NONE}current;
    Figure **field=nullptr;
 
    QPen penX, penO, penLines;
 
    int size;
    int formSize;
    int lineWidthFactor;
 
public:
    explicit Board(const int s=3, QWidget *parent=nullptr)
        :QWidget(parent), size(s){
 
        setStyleSheet("background:lightGray;");
 
        formSize=qMin(width(), height());
 
        lineWidthFactor = 7*size;
 
        field= new Figure*[size];
 
        for(int r=0; r<size; r++){
 
            field[r]=new Figure[size];
            for(int c=0; c<size; c++)
                field[r][c]=Figure::NONE;
        }
 
        penX.setColor(Qt::red);
        penX.setCapStyle(Qt::RoundCap);
        penO.setColor(Qt::blue);
        penLines.setColor(Qt::green);
        penLines.setCapStyle(Qt::RoundCap);
 
    }
 
    virtual ~Board(){
 
        if(!field) return;
 
        for(int r=0; r<size; ++r) {
            delete[] field[r];
        }
        delete[] field;
    }
 
    void drawFigure(Figure figure, QPainter &painter, const QRect &rect){
 
        switch (figure) {
        case Figure::X:{
            painter.save();
            painter.setPen(penX);
            painter.drawLine(rect.topLeft(), rect.bottomRight());
            painter.drawLine(rect.bottomLeft(), rect.topRight());
            painter.restore();
            break;
        }
        case Figure::O:{
            painter.save();
            painter.setPen(penO);
            int radius=qMax(rect.width(), rect.height())/2;
            painter.drawRoundedRect(rect,radius,radius);
            painter.restore();
            break;
        }
        default:
            break;
        }
    }
 
    void drawLines(QPainter&painter){
 
        painter.save();
 
        painter.setPen(penLines);
 
        int m=formSize/30;
 
        for(int c=1; c<size; c++){
            painter.drawLine((rect().width()/size)*c, m, (rect().width()/size)*c, height()-m);
            painter.drawLine(m,(rect().height()/size)*c, width()-m, (rect().height()/size)*c);
        }
 
        painter.restore();
    }
 
    void drawField(QPainter&painter){
 
        for(int r=0; r<size; r++){
            for(int c=0; c<size; c++){
 
                QRect rect{c * width()/size, r * height()/size, formSize/size, formSize/size};
                int m=qMax(rect.width(), rect.height())/4;
                drawFigure(field[r][c], painter, rect.adjusted(m, m,-m,-m));
            }
        }
 
        drawLines(painter);
    }
 
protected:
    void paintEvent(QPaintEvent *e){
 
        QWidget::paintEvent(e);
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        drawField(painter);
    }
 
    void resizeEvent(QResizeEvent *e){
 
        QWidget::resizeEvent(e);
 
        formSize=qMin(width(), height());
 
        if(width()!=height())
            resize(formSize,formSize);
 
        penX.setWidth(formSize/lineWidthFactor);
        penO.setWidth(formSize/lineWidthFactor);
        penLines.setWidth(formSize/lineWidthFactor);
    }
 
    void mousePressEvent(QMouseEvent *e){
 
        QWidget::mousePressEvent(e);
 
        QPoint pos=e->windowPos().toPoint();
 
        for(int r=0; r<size; r++){
            for(int c=0; c<size; c++){
 
                QRect rect{c * width()/size, r * height()/size, formSize/size, formSize/size};
 
                if(rect.contains(pos)){
 
                    if(field[r][c]!=Figure::NONE)
                        continue;
                    field[r][c]= (current==Figure::X ? Figure::O : Figure::X);
                    current=field[r][c];
                    update();
                    return;
                }
            }
        }
    }
};
2
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,260
14.02.2023, 20:57
Ну вот таблица 3х3, получена "формошлёпством", т.е. перетащена мышкой на форму. Ничего на ней не ёрзает, как у вас на видео. Правда курсор "бегает" по таблице, если водить по ней нажатой кнопкой мышки. Буквы рисуются выделением мышью соотв. ячейки и нажатием букв на клавиатуре. У вас так же? И какая версия Qt? У меня 5.15

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "widget.h"
#include "ui_widget.h"
 
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    // отключение курсора
    ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
 
    // инициализация таблицы
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            QTableWidgetItem *it = new QTableWidgetItem;
            it->setTextAlignment(Qt::AlignCenter);
            ui->tableWidget->setItem(i, j, it);
        }
 
 
    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
    QObject::connect(ui->pbtn_02,SIGNAL(clicked()),this,SLOT(press_pbtn_02()));
}
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
void Widget::press_pbtn_01()
{
 
}
 
 
void Widget::press_pbtn_02()
{
 
}
Миниатюры
Как избавиться от "движения" элементов внутри QTableWidget?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2023, 20:57
Помогаю со студенческими работами здесь

Обработка события нажатия на ячейку QTableWidget внутри одного класса
Есть класс Init, в котором я задаю свойства для переданной таблицы QTableWidget. Пытаюсь повесить обработчик наведения курсора на ячейку....

Избавиться от global внутри метода класса
Здравствуйте. Подскажите, какие-нибудь варианты чтобы можно было избежать использования global для переменных внутри методов класса? ...

Как избавиться от ненужных элементов?
Программа проста: for (int i = 'а'; i &lt;= 'я'; i++) { cout &lt;&lt; showbase &lt;&lt; (char) i &lt;&lt; &quot;\t&quot;; cout &lt;&lt; showbase &lt;&lt; hex...

QTableWidget (1) >>> QTableWidget (2) исключить повторяющиеся строки
Добрый день. Подскажите как лучше реализовать... Хочу реализовать исключение повторяющихся строк. Допустим из первого QTableWidget...

Моделирования движения окружности внутри прямоугольника с отражением по законам упругого соударения
Здравствуйте! Нужно написать программу для моделирования движения окружностей внутри прямоугольника. При столкновении окружностей со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru