Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alexu007 от Май 14, 2013, 08:00



Название: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 08:00
Нужно выводить в таблицу (в клеточки) одинаковые маленькие изображения - игра морской бой.

Какой компонент лучше использовать для вывода графики, как средствами Qt можно нарисовать эти самые маленькие изображения, и где их можно хранить внутри программы - не во внешних файлах?


Название: Re: Вывод графики
Отправлено: Bepec от Май 14, 2013, 08:13
Таблица тебе не подойдет? QTableView или QTableWidget для начала.

А рисовать можно на чём угодно. На любом виджете. Самый простой - QLabel.

Хранить можно в самом файле программы - за это отвечает qrc файл.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 14:02
Таблица подойдёт, только вместо таблицы рисуется белый квадрат, а нужно чтобы внутри была сетка. В редакторе свойств ничего не нашёл.


Название: Re: Вывод графики
Отправлено: GreatSnake от Май 14, 2013, 14:34
Таблица подойдёт, только вместо таблицы рисуется белый квадрат, а нужно чтобы внутри была сетка. В редакторе свойств ничего не нашёл.
Странно, т.к. QTableView::showGrid() по дефолту должен быть включён.


Название: Re: Вывод графики
Отправлено: alex312 от Май 14, 2013, 15:36
Странно, т.к. QTableView::showGrid() по дефолту должен быть включён.
Только по дефолту таблица пуста. ;)


Название: Re: Вывод графики
Отправлено: Bepec от Май 14, 2013, 15:38
Ну тогда для начала нужно добавить нужное количество записей с нужным количеством столбцов. Появится сеточка. Пара расчётов в коде и у нас будет готово квадратное/прямоугольное поле, состоящее из красивых квадратов или прямоугольников.


Название: Re: Вывод графики
Отправлено: GreatSnake от Май 14, 2013, 15:54
Странно, т.к. QTableView::showGrid() по дефолту должен быть включён.
Только по дефолту таблица пуста. ;)
Ну дык, кто ж знал, что автор забыл её наполнить ;)

Пара расчётов в коде и у нас будет готово квадратное/прямоугольное поле, состоящее из красивых квадратов или прямоугольников.
Только наверное нужно будет ещё убрать заголовки)


Название: Re: Вывод графики
Отправлено: Bepec от Май 14, 2013, 16:32
Ну да, убрать заголовочки )


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 18:07
Как сложно всё у вас. Вот к примеру в билдере:

1. Я помещаю на форму таблицу DrawGrid (или StringGrid)
2. В свойствах таблицы задаю необходимые параметры - кол-во строк, столбцов, размер и т.п.
3. Открываю книгу Архангельского, нахожу в ней нужный компонент - там написано, как с ним работать: как поместить текст в нужное место, как прочитать оттуда и т.п. с примерами кода и (при необходимости) фотографиями результата.
4. Юзаю этот компонент и при непонятках уточняю на форумах.

в Qt:
 
1. Помещаю (мышкой) на форму таблицу QTableView - получаю белый квадрат на форме.
2. В свойствах объекта нужных мне пунктов нет.
3. В какой книге можно прочитать про QTableView самые простые вещи, а именно - как ей пользоваться?
4. На форуме узнаю, что QTableView оказывается нужно было наполнить. Как? Чем? Куда писать код? Я пока не хочу её наполнять, да у меня и нечем пока, я просто хочу посмотреть, как будет выглядеть на форме пустая таблица с квадратиками. А потом буду пробовать вставлять в эти квадратики картинки - чтобы каждая попадала в свою ячейку.

Это раздел "вопросы новичков", я как раз в Qt новичок, где мне взять всю эту инфу?



Название: Re: Вывод графики
Отправлено: GreatSnake от Май 14, 2013, 18:32
Если хочешь всё сразу видеть используй QTableWidget.
И запусти уже Qt Assistant.

И какие-то странные претензии... Посмотри свой первый пост. Где там все эти твои последние вопросы ???


Название: Re: Вывод графики
Отправлено: thechicho от Май 14, 2013, 18:50
в Qt Assistant все есть.
поставь Qt Creator, там достаточно F1 нажать и откроется справка по классу(методу).
в описании класса как правило есть поясняющий пример.

а чего нет в ассистанте, есть в гугле


Название: Re: Вывод графики
Отправлено: Bepec от Май 14, 2013, 19:59
Alexu007 - ответ кроется в твоём же сообщении.


Вот к примеру в билдере:
-//-
3. Открываю книгу Архангельского
-//-

в Qt:
-//-
3. Открываю книгу "Жасмин Бланшет - QT 4 программирование GUI на C++"  или же Шлее
-//-


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 20:23
Если хочешь всё сразу видеть используй QTableWidget.
И запусти уже Qt Assistant.
Спасибо. Таблица нарисовалась с клетками. А как пользоваться Qt Assistant?

Нажал F1, справка по QTableWidget нарисовалась. Но там столько инфы... врагу не пожелаешь!

Сделали бы ликбез для чайников, а? Подскажите:

- строчку кода, которая помещает строку в таблицу в позицию col, row
- строчку ... которая читает из таблицы
- обработку кликов мышкой по ячейкам таблицы
- вывод графики в ячейки таблицы

Для 90% работ с таблицей нужны первые два пункта, остальные 10% - вторые два пункта. Больше таблица практически ни для чего не нужна.


Название: Re: Вывод графики
Отправлено: thechicho от Май 14, 2013, 21:15
- строчку кода, которая помещает строку в таблицу в позицию col, row
- строчку ... которая читает из таблицы
http://stackoverflow.com/questions/2779274/how-can-use-qtablewidget
- обработку кликов мышкой по ячейкам таблицы
Signals

void   cellActivated ( int row, int column )
void   cellChanged ( int row, int column )
void   cellClicked ( int row, int column )
void   cellDoubleClicked ( int row, int column )
- вывод графики в ячейки таблицы
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?key=QTableWidgetSetBackgroundImage&index=149

1. ищешь в ассистанте (там полезной инфы не много, а достаточно)
2. не нашел в ассистанте, ищешь в гугле
3. форум (когда западло первые два пункта, начинаем отсюда :))


Название: Re: Вывод графики
Отправлено: Bepec от Май 14, 2013, 21:18
Наконец то появились цензурные слова :D

Alexu007, я тебе по секрету скажу, что всё это написано сотни раз. Десятки и миллионы тем на форуме только ждут, когда ты запустишь поиск по форуму. Ассистент стенает и размахивает красным флагом, ожидая тебя в гости. Шлее тебе гарантирует ласковую доставку в нужную точку твоей программы. Но всем им нехватает только одного для создания крутейшей и красивейшей программы... Нехватает двух рук и головы в полном комплекте. Чтобы прочитать, понять, попробовать, скомпилировать пример ииии.... и спросить уже то, что тебе непонятно.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 22:50
Я не поленился, посчитал. В ассистанте 24 страницы (у меня на экране ноутбука) иностранного текста про QTableWidget - нехило для простой таблицы со строчками и столбиками...

Просмотрел (правда бегло) все 24 стр помощи - так и не нашёл никакого метода, который бы помещал текст в ячейку, что-то вроде setText(QString, int row, int col). QString вообще только в 3-х местах обнаружил: заполнение горизонтальных заголовков, заполнение вертикальных заголовков, и поиск по таблице. Как заполнить саму таблицу?

У Шлее пример того, как "вручную" в ходе выполнения программы создать таблицу (а нафига мне создавать в ходе выполнения, я хочу, чтобы таблица была сразу при запуске программы), как внутри таблицы создать ячейки (оказывается, каждая ячейка не составная часть таблицы, а отдельный объект!, который нужно создавать с помощью new!), и при создании заполнить их неким значением. Стр. 213

Ни слова о том, как с этой таблицей работать, после того как она уже создана. Как поместить в неё в нужную ячейку строку. Как прочитать из неё строку при необходимости. Ну правда написал, что изображение можно туда поместить с помощью QTableWidgetItem::setIcon(). Пример конечно привести не счёл нужным...

Полезной информации (по крайней мере для моего случая) - почти ноль. Или я чего не понимаю?


Название: Re: Вывод графики
Отправлено: thechicho от Май 14, 2013, 23:13
QTableWidget

смотришь
Public Functions
Public Slots
Signals
читаешь
Detailed Description

Table widgets can be constructed with the required numbers of rows and columns:

     tableWidget = new QTableWidget(12, 3, this);
Alternatively, tables can be constructed without a given size and resized later:

     tableWidget = new QTableWidget(this);
     tableWidget->setRowCount(10);
     tableWidget->setColumnCount(5);

читаешь то, что нужно, а не все "24 страницы на экране твоего ноутбука"


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 14, 2013, 23:24

     tableWidget = new QTableWidget(12, 3, this);
Alternatively, tables can be constructed without a given size and resized later:

     tableWidget = new QTableWidget(this);
     tableWidget->setRowCount(10);
     tableWidget->setColumnCount(5);

читаешь то, что нужно, а не все "24 страницы на экране твоего ноутбука"
Это уже неактуально, я таблицу взял из готовых компонентов, она сразу на экране появляется - с нужным числом col и row, это в свойствах таблицы устанавливается. Как в неё информацию засовывать?

А если даже создавать в ходе выполнения, куда, в main чтоли эти строчки вписывать? Ну, чтобы сразу на форме появлялась при запуске прораммы? Я вообще в майн никогда ничего стараюсь не писать...


Название: Re: Вывод графики
Отправлено: thechicho от Май 14, 2013, 23:50
//Это уже неактуально, я таблицу взял из готовых компонентов, она сразу на экране появляется - с нужным числом col и row, это в свойствах таблицы устанавливается. Как в неё информацию засовывать?
QTableWidget
Public Functions
QTableWidgetItem * item ( int row, int column ) const

QTableWidgetItem
Public Functions
virtual void setData ( int role, const QVariant & value )
void setText ( const QString & text )

ui->tableWidget->item(1, 1)->setText("Alexu007 нубас");


//А если даже создавать в ходе выполнения, куда, в main чтоли эти строчки вписывать? Ну, чтобы сразу на форме появлялась при запуске прораммы?
в конструктор


Название: Re: Вывод графики
Отправлено: lighting от Май 15, 2013, 10:49
А если даже создавать в ходе выполнения, куда, в main чтоли эти строчки вписывать? Ну, чтобы сразу на форме появлялась при запуске прораммы? Я вообще в майн никогда ничего стараюсь не писать...
Этих вопросов не было-бы если бы вы попытались сначала разобраться с Qt прежде чем писать нужную вам программу. На велосипеде вы поди тоже сначала кататься учились, а не сразу по делам поехали. Решите для себя сначала чего вы хотите, если программу готовую получить то закажите кому-нибудь и не переживайте из-за всех этих сложностей. Ну а если хотите разобраться и научиться писать самостоятельно то начинайте изучение с начала, а не с середины (как вы сейчас сделать пытаетесь судя по вашим вопросам). В билдере наверное с Hello world начинали, вот и здесь с него начните. Ну и книжку хорошую почитайте, Бланшет или Шлее, как вам уже выше советовали, многие вопросы сами отпадут.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 21:06
Этих вопросов не было-бы если бы...
Ну что тут сказать? Для работы с обычной стандартной кнопкой достаточно 3-х строчек кода:

Код
C++ (Qt)
public slots:  void MyEventHandler();
 
QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(MyEventHandler()));
 
void MyWidget::MyEventHandler()    {    }

Давайте учить программирование. Начнём со справки:

Цитировать
Inherits: QAbstractButton.
...
Inherited by: QCommandLinkButton.
...
List of all members, including inherited members
Qt 3 support members
Properties
...
11 properties inherited from QAbstractButton
58 properties inherited from QWidget
1 property inherited from QObject
...
21 public functions inherited from QAbstractButton
221 public functions inherited from QWidget
29 public functions inherited from QObject
13 public functions inherited from QPaintDevice
...

Программирование - дело ответственное! И опасное! Прежде чем нажать на кнопку QpushButton, нужно прочитать про каждую из 11+58+1 properties inherited (не знаю как переводится), а затем ещё про 21=221=29+13 public functions (открытых функций), а как без этого? Вдруг чего важного упустишь... По крайней мере, с этого перечисления начинается стандартная справка. Шлее в руки, и вперёд, глядишь к концу учебного года и освоим кнопку? Хрена с два!

Я, правда, не занимался специальными изысканиями, но почему-то уверен, что приведённых в начале поста 3-х строчек кода нет ни в справке, ни у Шлея. Я их нашёл на просторах интернета, где какой-то умелец сжалился, и научил, как практически пользовать эту QpushButton.

А пока читаю Шлея, я уже научился делать окно винды из Qlabel с надписью - афигенно полезная инфа (уж лучше бы стандартное окно виндовс с единственной меткой, в которую помещаем текст хоть по нажатию кнопки - в любой программе пригодица), и застрял на философии объектной модели. Всё вокруг объекты...


Название: Re: Вывод графики
Отправлено: thechicho от Май 15, 2013, 21:13
кнопку можно из дизайнера соединить со слотом. все делается мышкой.
и еще раз повторюсь, полезной инфы в ассистанте не много, а достаточно. другими словами не надо все от корки до корки изучать. читаешь то, что нужно для решения твоей проблемы.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 21:22
...
Спасиб за конкретику. Но написать в таблице в моём приложении в ячейке 1,1 "Alexu007 нубас" всё равно не получается? потому что:

1. У меня в приложении есть 3 файла, myWidget.h:

Цитировать
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT
    
public:
    explicit MyWidget(QWidget *parent = 0);
    ~MyWidget();

    QTableWidgetItem * item ( int row, int column ) const;
    
private:
    Ui::MyWidget *ui;

public slots:
    void MyEventHandler();
};

#endif // MYWIDGET_H

main.cpp:

Цитировать
#include <QtGui/QApplication>
#include "mywidget.h"

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

и mywidget.cpp:

Цитировать
#include "mywidget.h"
#include "ui_mywidget.h"

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
    {
    ui->setupUi(this);



    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(MyEventHandler()));
    }


MyWidget::~MyWidget()
    {
    delete ui;
    }


void MyWidget::MyEventHandler()
    {

    return;
    }

QTableWidget
Public Functions
QTableWidgetItem * item ( int row, int column ) const

QTableWidgetItem
Public Functions
virtual void setData ( int role, const QVariant & value )
void setText ( const QString & text )

Это как я понимаю, объекты, в реализацию которых ( в public) нужно вставить указанные вами строки кода. Но в моём коде автоматически не появились эти объекты, несмотря на то, что я их мышкой перетащил на форму. Поэтому я не понимаю, куда писать?



Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 21:27
кнопку можно из дизайнера соединить со слотом. все делается мышкой.
и еще раз повторюсь, полезной инфы в ассистанте не много, а достаточно. другими словами не надо все от корки до корки изучать. читаешь то, что нужно для решения твоей проблемы.
Одним соединением кнопки со слотом (мышкой) не обойдёшься, нужно ещё минимум 2 строчки кода ( в .h и в .cpp), которые нужно шаманить с бубном.


Название: Re: Вывод графики
Отправлено: thechicho от Май 15, 2013, 21:33
//Одним соединением кнопки со слотом (мышкой) не обойдёшься, нужно ещё минимум 2 строчки кода ( в .h и в .cpp), которые нужно шаманить с бубном
откуда такая уверненность ;D
код автоматически сгенерируется


Название: Re: Вывод графики
Отправлено: thechicho от Май 15, 2013, 21:44
(http://upload.wikimedia.org/wikipedia/ru/a/a3/%D0%A3%D0%BF%D0%BE%D1%80%D0%BE%D1%82%D1%8B%D0%B9_%D0%BB%D0%B8%D1%81.jpeg)
это не ты случаем? :D

в конструкторе, после
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
    {
    ui->setupUi(this);

начни писать
ui->
тебе Qt Creator выдаст список виджетов. выбираешь таблицу (ui->tableWidget
далее смотришь, что есть у таблицы ui->tableWidget->
выбираешь итем ui->tableWidget->item(0, 0)
смотришь, что у него есть ui->tableWidget->item(0, 0)->
устанавливаешь ui->tableWidget->item(0, 0)->setText("Alexu007 нубас");
только убедись, что ты в дизайнере добавил хотя бы 1 строку и столбец, или упадет


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 22:00
//Одним соединением кнопки со слотом (мышкой) не обойдёшься, нужно ещё минимум 2 строчки кода ( в .h и в .cpp), которые нужно шаманить с бубном
откуда такая уверненность ;D
код автоматически сгенерируется
Ну да, чё то такое было, соединял, и она у меня по нажатию кнопки копировала из одного edit в другой, а потом по нажатии второй кнопки всё стирала. Тока я этот пример затёр, а откуда его брал, уже не помню... Но что-то смутно припоминаю, что нихрена там не сгенерировалось, там был пример, куда надо написать copy, она и скопировалась... А если что посложнее copy или там delete?

Вот это: void MyWidget::MyEventHandler()   {   }  автоматически генерируется? Это, если назвать по простому, функция, которая вызывается при нажати кнопки. И в которую можно писать код, обрабатывающий нажатие этой самой кнопки. Просто, без лишней зауми, для носорога - т.е для меня - но с помощью этой штуки я уже могу писать программы, которые как-то реагируют на нажатия кнопок. Хоть я и не понимаю, кого кнопка наследует, кого копирует, и так и далее.

Но вот чего я пока не понимаю - это как поместить в таблицу строку символов, что для этого нужно написать и в каких файлах. Тогда как таблица у меня уже в приложении, я её туда мышкой перетащил, и ни строчки кода при этом не написал.







Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 22:08
(http://upload.wikimedia.org/wikipedia/ru/a/a3/%D0%A3%D0%BF%D0%BE%D1%80%D0%BE%D1%82%D1%8B%D0%B9_%D0%BB%D0%B8%D1%81.jpeg)
это не ты случаем? :D
Это я. То что в билдере получалось легко - например запись в таблицу, ну элементарная же вещь, здесь требует какого-то мозгового штурма и срача на форуме. Либо брать учебник Шлее и учить сначала всё, к середине книги как раз забудешь, нахрен тебе сдалась эта таблица...

А Шлей, кстати, ничего не написал про:

Цитировать
начни писать
ui->


Название: Re: Вывод графики
Отправлено: Bepec от Май 15, 2013, 22:14
Alexu007. Вы категорически отказываетесь понимать что-либо :)

Поясню на примере.

С++ - это куски руды и спичка.

Qt - это готовые детали плюс инструменты для соединения их.

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

PS берите примеры, изучайте. Их десятки в Qt. Готовые. Рабочие. Захотите - будете писать на Qt. Не хотите - лучше закажите кому нибудь.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 22:36
устанавливаешь ui->tableWidget->item(0, 0)->setText("Alexu007 нубас");
только убедись, что ты в дизайнере добавил хотя бы 1 строку и столбец, или упадет
Кстати, не работает. В дизайнере установлено 10 строк 10 столбцов, и форма рисуется со строками и столбцами - могу скрин снять, а при нажатии кнопки падает (я эту строку для удобства в нажатие копки поместил). А если в конструктор - то сразу падает при запуске программы. C:\QtSDK\Alexu007\Proga1\Proga_1\debug\Proga_1.exe завершился с кодом -1073741819


Название: Re: Вывод графики
Отправлено: thechicho от Май 15, 2013, 22:50
 :D сделай скрин, чтобы было видно objectName таблицы в дизайнере

кстати, да :) если в дизайнере итемы не создать (добавить что-нибудь в ячейки), то будет падать

QTableWidgetItem *item = new QTableWidgetItem("Alexu007 нубас");
ui->tableWidget->setItem(0, 0, item);

qDebug() << endl << ui->tableWidget->item(0, 0)->text();


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 15, 2013, 23:25
Код
C++ (Qt)
void MyWidget::MyEventHandler()
   {
 
   ui->tableWidget->setRowCount(3);
   ui->tableWidget->setColumnCount(3);
 
   QTableWidgetItem *item = new QTableWidgetItem("Alexu007 nubas");
   ui->tableWidget->setItem(0, 0, item);
 
   //ui->tableWidget->item(1,1)->setText("Alexu007 nubas");
   return;
   }

Вот так работает (только нубас кракозябрами пишет, я по английски переписал  :) ), а если раскомментировать последню строку - вылетает с ошибкой.


Название: Re: Вывод графики
Отправлено: thechicho от Май 15, 2013, 23:49
добавь в main.cpp

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);

переведи исходники в UTF-8

сможешь пользоваться кириллицией в коде.

//ui->tableWidget->item(1,1)->setText("Alexu007 nubas");
у тебя не создан итем в ячейке (1,1), поэтому падает.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 07:33
//ui->tableWidget->item(1,1)->setText("Alexu007 nubas");
у тебя не создан итем в ячейке (1,1), поэтому падает.
Спасибо большое. Теперь боле мене понятно, чтобы пользоваться setText в программе, нужно заранее в цикле требуемое кол-во итемов создать. Либо добавлять по одному по мере увеличения таблицы. Я кстати где-то вроде видел что-то похожее, но не понял, почему так.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 09:13
Код
C++ (Qt)
   QIcon icon("C:/temp/qwe.png");
   QTableWidgetItem *icon_item = new QTableWidgetItem;
   icon_item->setIcon(icon);
   icon_item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
   ui->tableWidget->setItem(0, 1, icon_item);

Изображение в ячейку выводит, но очень маленькое. Независимо от размера исходной кртинки. Похоже, она из любой картинки маленькую иконку делает.  Как его растянуть на всю ячейку?


Название: Re: Вывод графики
Отправлено: lighting от Май 16, 2013, 09:21
Ну что тут сказать? Для работы с обычной стандартной кнопкой достаточно 3-х строчек кода:

Код
C++ (Qt)
public slots: void MyEventHandler();
 
QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(MyEventHandler()));
 
void MyWidget::MyEventHandler()   {   }
....
Я, правда, не занимался специальными изысканиями, но почему-то уверен, что приведённых в начале поста 3-х строчек кода нет ни в справке, ни у Шлея. Я их нашёл на просторах интернета, где какой-то умелец сжалился, и научил, как практически пользовать эту QpushButton.
Ну и как вам помогла жалось этого умельца если вы все равно не знаете куда эти строчки вставить?
Как я уже писал выше вы взялись не за то, QTableWidget достаточно сложен для начинающего и чтобы им пользоваться какую-никакую базу надо иметь.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 09:58
Ну и как вам помогла жалось этого умельца если вы все равно не знаете куда эти строчки вставить?
Помогла. Он написал, куда эти строчки вставлять, в какие файлы и в какие места. В раздел "готовые решения" загляните - я там калькулятор выложил, написанный как раз благодаря этим строчкам. Работает.


Цитировать
Как я уже писал выше вы взялись не за то, QTableWidget достаточно сложен для начинающего и чтобы им пользоваться какую-никакую базу надо иметь.
Что значит сложен? Таблица сложна для моего понимания? Она состоит из строк и столбцов и предназначена для вывода информации. Этого достаточно для новичка, а если мне нужны будут всякие углублённые возможности таблицы - я засяду за учебники.

Как бы QTableWidget ни был сложен, я уже умею туда строки текста вставлять и иконки. Только вот пока не получается вместо иконки полноценное изображение вывести.


Название: Re: Вывод графики
Отправлено: GreatSnake от Май 16, 2013, 10:03
Как его растянуть на всю ячейку?
Код
C++ (Qt)
void QAbstractItemView::setIconSize( const QSize& size );

Имхо, для твоей задачи удобнее будет использовать QListWidget в режиме IconMode.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 10:37
Код
C++ (Qt)
   QSize& size(64, 64);
 
   void QAbstractItemView::setIconSize(const QSize& size);

Ругается на вторую строчку: invalid use of qualified-name 'QAbstractItemView::setIconSize'


Название: Re: Вывод графики
Отправлено: GreatSnake от Май 16, 2013, 10:42
Мде... Похоже у нас громадные пробелы в знаниях С++.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 11:06
Мде... Похоже у нас громадные пробелы в знаниях С++.
Тема называется "Вопросы новичков".


Название: Re: Вывод графики
Отправлено: GreatSnake от Май 16, 2013, 11:08
Тема называется "Вопросы новичков".
Да, только вот форум Qt, а не C++.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 11:58
Ну и сам разобрался... просто затупил чё-то с этим воидом...

Код
C++ (Qt)
ui->tableWidget->setIconSize(QSize(32, 32));

А иконки всегда только квадратные? Прямоугольные картинки по размеру ячейки нарисовать никак? Меня пока квадраты более чем устраивают, но так, на будущее...


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 16, 2013, 22:25
Тут ещё такое дело. Иконки имеют отступ от левой линии таблицы, в результате имеем визуально несимметричные линии. Некрасиво. Как бы вывести прям за линией таблицы?


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 17, 2013, 07:22
Похоже, tableWidget не подходит для игр с квадратным игровым полем - типо шашки шахматы и т.п. А жаль - сетка уже готова, клик по ячейкам обрабатывается. А нельзя в эту ячейку таблицы не иконку вывести (иконки не растягиваются на всю ячейку...) а просто изображение?

Либо посоветуйте другой компонент, который для этого подойдёт - типо таблицы изображений.

Или проще с нуля рисовать всё игровое поле?


Название: Re: Вывод графики
Отправлено: Kurles от Май 17, 2013, 10:54
Похоже, tableWidget не подходит для игр с квадратным игровым полем - типо шашки шахматы и т.п. А жаль - сетка уже готова, клик по ячейкам обрабатывается. А нельзя в эту ячейку таблицы не иконку вывести (иконки не растягиваются на всю ячейку...) а просто изображение?

Либо посоветуйте другой компонент, который для этого подойдёт - типо таблицы изображений.

Или проще с нуля рисовать всё игровое поле?
QGridLayout для сетки и QLabel для изображений как вариант


Название: Re: Вывод графики
Отправлено: alex312 от Май 17, 2013, 12:48
Или проще с нуля рисовать всё игровое поле?
да (http://qt-project.org/doc/qt-5.0/qtwidgets/examples-graphicsview.html)


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 17, 2013, 16:05
А счастье было так возможно... только с таблицей чуток разобрался, и начинай сначала. Какой мучудак придумал сделать этот отступ? Ну почему нельзя было начинать рисовать с границы ячейки, а если программисту (мне) нужен этот отступ - я мог бы и сам на иконке белую полоску пририсовать... Или дать возможность менять этот отступ программно. Нафига?

В целой куче приложений можно было использовать, где используется игровое поле в клеточку. А так это почти бесполезная фича для демонстрации безграничных возможностей Qt.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 17, 2013, 16:47
Или проще с нуля рисовать всё игровое поле?
да (http://qt-project.org/doc/qt-5.0/qtwidgets/examples-graphicsview.html)
Как это сделать практически, рисовать лучше на каком компоненте? Он должен уметь:

1. рисовать линии для сетки - эт наверное все умеют.
2. выводить рисунки в нужное место прямоугольного окна.
3. при клике на полученное изображение формировать прерывание (вызывать функцию) и передавать в неё координаты клика.


Название: Re: Вывод графики
Отправлено: Igors от Май 17, 2013, 19:28
Или проще с нуля рисовать всё игровое поле?
А почему нет? Простое перекрытие paintEvent - это решение возможно всегда. Даже если оно не лучшее - другому уступит не намного. Что там рисовать? По любому самопал, готового нет. Отработка кликов - ну разоритесь на десяток-другой строчек.  Если бы вместо "поиска чудесной компоненты" (4 листа хлама) Вы бы незатейливо рисовали - все давно было бы сделано и забыто.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 17, 2013, 20:39
Или проще с нуля рисовать всё игровое поле?
А почему нет? Простое перекрытие paintEvent - это решение возможно всегда. Даже если оно не лучшее - другому уступит не намного. Что там рисовать?

Понимаете, мне нужна помощь в самых простых вещах. У меня есть форма с одной кнопкой (работает), и 2 файла .h и .cpp. Как по нажатию кнопки нарисовать на форме прямую линию? Вот этого недостаточно, программа запускается но работать не хочет:

Код
C++ (Qt)
void MyWidget::MyEventHandler1()
   {
 
   QPainter p(this);
   p.setPen(Qt::green);
   p.drawLine(0, 0, 100, 100);
 
   return;
   }

чё то ей не хватает, painter неактивен или неактивирован...


Цитировать
Если бы вместо "поиска чудесной компоненты" (4 листа хлама) Вы бы незатейливо рисовали - все давно было бы сделано и забыто.

Ну какой же это хлам? Я всё-таки вымучил из корифеев, как записать в таблицу в нужную ячейку строчку, и как поместить иконку. Нужно выложить в "готовые решения" простенькую программку, демонстрирующую работу с таблицей - для таких же чайникофф, как я.


Название: Re: Вывод графики
Отправлено: Bepec от Май 17, 2013, 20:56
Понимаете, достаточно написать 5-7 программ на Qt чтобы понять принцип. Дальнейшее не сложнее чем лего.

Это для вас сложно, потому что вы хотите сразу собрать работающий и летающий звездолёт. А нужно начинать со стула.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 17, 2013, 22:19
А нужно начинать со стула.

С чего нужно начинать новичку? У меня Qt Creator 2.4.1 В какой книге прочитать простейшее - как создать новый проект, правильно его сохранить, поместить мышкой на форму кнопку, Label - и по нажатию кнопки написать в Label "Hello Word"?

Я и начинаю с простейшего: как обработать нажатие кнопки, как вывести на форму строку, как нарисовать линию. А с чего мне надо начинать - с множественного наследования классов?

 


Название: Re: Вывод графики
Отправлено: Bepec от Май 17, 2013, 22:36
C линии. Читайте Бланшета или Шлее. Открывайте сразу раздел, который вас интересует. И там с нуля будет описано как сделать то или иное. С примерами кода.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 18, 2013, 19:36
Ну примерно заработало:

Код
C++ (Qt)
void MyWidget::paintEvent( QPaintEvent *event )
   {
 
   #define x_pos 70
   #define y_pos 25
 
   QPainter p(this);
   QImage img("c:/temp/qwe.png");
 
   //p.setPen(Qt::red);
 
   for(int i = x_pos; i < (x_pos+275); i += 25 ) p.drawLine(y_pos, i, y_pos+250, i);
   for(int i = y_pos; i < (y_pos+275); i += 25)  p.drawLine(i, x_pos, i, x_pos+250);
 
   //p.drawImage(mouse_x, mouse_y, img);
 
   for(int i = 0; i < 10; i++)
    for(int j = 0; j < 10; j++)
       {
       if (i == j) p.drawImage((y_pos+1+i*25), (x_pos+1+j*25), img);
       }
 
   return;
   }

Но вопросы остаются:

1.  Эта функция вызывается по update(); и перерисовывает всю картинку: и сетку и наполнение сетки. В принципе мне достаточно нарисовать сетку 1 раз, но приходится каждый раз перерисовывать.

2. Не очень люблю графику, но хотелось бы хоть немного приукрасить сетку, а именно - прикрутить внешнее обрамление. Но если я в конструкторе (да и не в конструкторе) вывожу на форму картинку:

Код
C++ (Qt)
ui->label->setPixmap(QPixmap("c:/temp/qwe1.png"));

то рисовать поверх её уже не получается, картинка всегда сверху. А хотелось бы тиснуть на форму картинку, а внутрь вписать сетку. Можете что-нибудь посоветовать?


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 18, 2013, 19:43
Ещё вопрос: рисовать по форме можно только внутри MyWidget::paintEvent? А нельзя, например, в обработчике нажатия кнопки (или в конструкторе) нарисовать хоть прямую линию?


Название: Re: Вывод графики
Отправлено: Igors от Май 19, 2013, 09:04
С чего нужно начинать новичку?
Qt очень хорош для того кто уже имеет опыт. Напр уже лет 20 ни в одной графической системе нельзя рисовать "просто так, когда хочу". Подумайте - может и не стоит спешить, Qt никуда не убежит. Резвый старт с "самого крутого" часто оборачивается тупенькой зубрежкой чужихк классов - без понимания сути/основ


Название: Re: Вывод графики
Отправлено: Old от Май 19, 2013, 09:41
Напр уже лет 20 ни в одной графической системе нельзя рисовать "просто так, когда хочу".
Ну вообще-то, рисовать можно в любой момент и в любом месте (хоть в деструкторе), а вот визуализировать нарисованное нужно централизовано.


Название: Re: Вывод графики
Отправлено: Bepec от Май 19, 2013, 10:24
Можно рисовать на QImage/QPixmap, а перерисовывать только нужный участок с помощью update.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 19, 2013, 10:52
С чего нужно начинать новичку?
Qt очень хорош для того кто уже имеет опыт. Напр уже лет 20 ни в одной графической системе нельзя рисовать "просто так, когда хочу". Подумайте - может и не стоит спешить, Qt никуда не убежит. Резвый старт с "самого крутого" часто оборачивается тупенькой зубрежкой чужихк классов - без понимания сути/основ
Тут всё зависит от предполагаемой цели. Если цель - стать профессиональным (высокооплачиваемым ессно!) программистом, то оно конечно. Для меня программирование - хобби. Что-то вроде составления кроссвордов. Пишу простенькие программки для своего удовольствия.

Нафига мне зубрить чужие классы? Мне пока хватает тех кнопочек, окошек и меню, которые идут в комплекте с Qt creator. А уж навесить на них функций я и сам смогу.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 19, 2013, 10:58
Можно рисовать на QImage/QPixmap, а перерисовывать только нужный участок с помощью update.
Спасибо, но для меня это мало что говорит. Желателен рабочий пример.

Но, собсна, то что я хотел - я выяснил. На картинке и сетка и "вода" и "корабли" для морского боя. И клики мышкой обрабатываются - добавляется/пропадает палуба.


Название: Re: Вывод графики
Отправлено: kamre от Май 19, 2013, 12:10
Разве это не кощунство загружать картинки при каждом вызове paintEvent?
По хорошему на момент вызова paintEvent все картинки уже должны быть в видеопамяти, чтобы рисовалось максимально быстро средствами видеокарты.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 19, 2013, 12:52
Конечно кощунство. Но никто не подсказал же, как можно нарисовать картинку, а потом вызвать paintEvent только для изменений в картинке - чтобы максимально быстро. А у меня получилось рисовать только внутри paintEventа.


Название: Re: Вывод графики
Отправлено: Kurles от Май 19, 2013, 12:57
Самая простая оптимизация, которая сюда просится - загружать картинки один раз вне paintEvent.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 19, 2013, 17:39
Самая простая оптимизация, которая сюда просится - загружать картинки один раз вне paintEvent.
1. Я так и не смог ничего нарисовать прямо на форме без paintEvent. Подскажите, как можно загрузить на форму картинку, поверх которой затем можно рисовать paintEventом?

2. Картинка обновляется не столь часто, только после хода - не чаще раза в несколько секунд. И обновляется  быстро - на глаз незаметно. Стоит ли городить огород для пустяковой программы?



Название: Re: Вывод графики
Отправлено: Igors от Май 19, 2013, 18:53
1. Я так и не смог ничего нарисовать прямо на форме без paintEvent. Подскажите, как можно загрузить на форму картинку, поверх которой затем можно рисовать paintEventом?

Код
C++ (Qt)
   QPainter p(this);
   QImage img("c:/temp/qwe.png");
 
Зачем Вы грузите картинку при каждом рисовании? Сделайте переменную (напр m_img) членом класса, загрузите один раз в конструкторе. И пользуйтесь при каждом рисовании. Вы настойчиво стучитесь в открытую дверь  :)


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 19, 2013, 21:33
Я поместил рисунки в ресурс и загружаю уже оттуда. Это что-то меняет?

Ну, я объявил в классе в public две переменные: QImage img1, img2;
а как их в конструкторе загружать? Они же загружаются при объявлении: QImage img1(":/images/0.png");


Название: Re: Вывод графики
Отправлено: Kurles от Май 19, 2013, 23:38
Я поместил рисунки в ресурс и загружаю уже оттуда. Это что-то меняет?

Ну, я объявил в классе в public две переменные: QImage img1, img2;
а как их в конструкторе загружать? Они же загружаются при объявлении: QImage img1(":/images/0.png");
Мда.
Код
C++ (Qt)
// somewhere in constructor...
img1 = QImage(":/images/0.png");
И можно (нужно?) их приватными сделать.


Название: Re: Вывод графики
Отправлено: Alexu007 от Май 20, 2013, 07:29
Мда.
И можно (нужно?) их приватными сделать.
Сделал. Работает. Спасибо большое за конкретную помощь.

Остался последний штрих. Нарисовать на форме картинку игрового поля в конструкторе, а в ходе игры дорисовывать только изменения - чтобы раз за разом не перерисовывать всё поле. Подскажете?


Название: Re: Вывод графики
Отправлено: lighting от Май 20, 2013, 10:20
Остался последний штрих. Нарисовать на форме картинку игрового поля в конструкторе, а в ходе игры дорисовывать только изменения - чтобы раз за разом не перерисовывать всё поле. Подскажете?
Да подсказали-же уже несколько раз. Заведи еще один QImage game_map размером с игровое поле, заведи булеву переменную need_update, в своем слоте-обработчике нажатий рисуй необходимые изменения
Код
C++ (Qt)
QPainter p;
p.begin(game_map);
// ... draw changes here
p.end;
need_update = true;
 
а в paintEvent пишешь следующее:
Код
C++ (Qt)
QPainter p(this);
if (need_update)
{
  p.begin;
  p.drawImage(0,0, game_map);
  p.end;
  need_update = false;
}