Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Doszhan от Февраль 26, 2011, 12:01



Название: Картинка "с кликом"
Отправлено: Doszhan от Февраль 26, 2011, 12:01
Доброго времени суток,

В универе писали вторую нашу в жизни программу на Qt - крестики-нолики. Ячейки делали как кнопки. Домой задали морской бой.

Хочу сделать так:
Фон игры - скан нарисованными руками 2 таблицы по 10Х10. Теперь мне надо отлавливать клики по каждой ячейке таблиц. Как это осуществить? Посылать сигнал если клик будет сделан по такому квадрату пикселей? Или сделать невидимые кнопки?

Буду признателен совету и какой-нибудь ссылке (англ или рус)


Название: Re: Картинка "с кликом"
Отправлено: m_ax от Февраль 26, 2011, 13:20
Хочу сделать так:
Фон игры - скан нарисованными руками 2 таблицы по 10Х10. Теперь мне надо отлавливать клики по каждой ячейке таблиц. Как это осуществить? Посылать сигнал если клик будет сделан по такому квадрату пикселей? Или сделать невидимые кнопки?

Скан??? Лучше написать нормальный виджет с возможностью редактирования клеток..
Всё это реализуется через переопределения событий.

Хотя я бы ещё посмотрел в сторону модель-представление. Посмотрите на пример у тролей, где они реализовали своё представление Chart Example вроде.


Название: Re: Картинка "с кликом"
Отправлено: SABROG от Февраль 26, 2011, 13:22
Посмотри исходники Character Map Example (http://doc.qt.nokia.com/latest/widgets-charactermap.html)

Клеточки рисуются через переопределение paintEvent, а координаты клика мыши переводятся в нужный квадрат. Реализовывать через QPushButton'ы по-моему, оверхед.


Название: Re: Картинка "с кликом"
Отправлено: Doszhan от Февраль 26, 2011, 13:48
Спасибо, буду пробовать реализовывать через pixmap.

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

UPD: точнее не pixmap, а просто QPoint :)


Название: Re: Картинка "с кликом"
Отправлено: Doszhan от Февраль 26, 2011, 17:19
Все время выходит ошибка, прошу помощи.

logic.h:
Код:
#ifndef LOGIC_H
#define LOGIC_H

#include <QtGui>

class Logic : public QWidget{

public:
    Logic(QWidget *parent = 0);
    QPoint click;
    void mousePressEvent(QMouseEvent *event);
};

#endif // LOGIC_H

mainwindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "logic.h"
#include <QtGui/QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    Logic *log;
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

};

#endif // MAINWINDOW_H

logic.cpp:
Код:
#include "logic.h"
#include <QtGui>

void Logic::mousePressEvent(QMouseEvent *event)
{
    click = event->pos();
    QString str = QString::number(click.x());
    QMessageBox::critical(this, "Coordiantes", str);
}

main.cpp:
Код:
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "logic.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    log = new Logic;
    QWidget *window = new QWidget;
    this->resize(300, 300);
}

MainWindow::~MainWindow()
{

}

Error:
undefined reference to 'Logic::Logic(QWidget*)'



Я хотел сделать так, чтобы все функции были описаны в файле logic.cpp.


Название: Re: Картинка "с кликом"
Отправлено: Пантер от Февраль 26, 2011, 17:37
А кто за тебя Logic(QWidget *parent = 0); будет реализовывать?


Название: Re: Картинка "с кликом"
Отправлено: Doszhan от Февраль 26, 2011, 17:45
А кто за тебя Logic(QWidget *parent = 0); будет реализовывать?

:)

Большое спасибо.

Я хотел, чтобы при клике выводилось сообщение с координатом по X, а сейчас просто выводится окно.

logic.cpp:
Код:
#include "logic.h"
#include <QtGui>

Logic::Logic(QWidget *parent):QWidget(parent)
{
}

void Logic::mousePressEvent(QMouseEvent *event)
{
    click = event->pos();
    QString str = QString::number(click.x());
    QMessageBox::critical(this, "Coordiantes", str);
}

UPD:Разобрался.

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "logic.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    log = new Logic;
    QWidget *window = new QWidget;
    QGridLayout *layout = new QGridLayout;
    layout->addWidget(log);
    log->resize(300,300);
    window->setLayout(layout);
    this->setCentralWidget(window);
}

MainWindow::~MainWindow()
{

}