проблема с заменой фонового изображения с помощью signal/slot в qt

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

Обратите внимание, что я не хочу, чтобы эти «ходы фигур» подчинялись правилам настоящих шахмат. Я только хочу сделать замену изображения между двумя ячейками. Позже я заставлю их подчиняться правилам.

вот код. в этом коде только элемент таблицы (0,0) имеет изображение. Кто-нибудь может сказать, как написать код, чтобы, когда я нажимаю на этот элемент, затем нажимаю на элемент (1,1), изображение «1.bmp» переходило на фон элемента (1,1)?

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QHBoxLayout>
#include <QTableWidget>
#include <QHeaderView>

class Table : public QWidget
{
    Q_OBJECT

  public:
    Table(QWidget *parent = 0);
slots:
    //??????

};


Table::Table(QWidget *parent)
    : QWidget(parent)
{
  QHBoxLayout *hbox = new QHBoxLayout(this);

  QTableWidget *table = new QTableWidget(8 , 8 , this);

  table->setFixedSize(900,900);
  table->horizontalHeader()->setDefaultSectionSize(100);
  table->verticalHeader()->setDefaultSectionSize(100);

  table->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
  table->verticalHeader()->setResizeMode(QHeaderView::Fixed);

  QString fileName = "/1.bmp";
  QPixmap pic(fileName);

  QBrush brush(pic);

  QTableWidgetItem* item = new QTableWidgetItem();
  item->setBackground(brush);

  table->setItem(0,0,item);

  hbox->addWidget(table);
  setLayout(hbox);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Table table;

    table.show();


    return app.exec();
}

person Omid    schedule 09.07.2010    source источник


Ответы (1)


Тут действительно два вопроса.

Первый касается сигналов/слотов с QTableWidgetItem, а второй касается обработки щелчков мыши на QTableWidget.

Слоты сигналов в QTableWidgetItem

  • примечание: я не рекомендую делать это таким образом, читайте до конца *

Использование сигналов и слотов требует, чтобы объект, который испускает сигнал, имел сигнал, определенный в определении класса. Точно так же объект, который получает слот, должен иметь этот слот, объявленный в определении класса.

Вы заметите (в документации Qt), что QTableWidgetItem не имеет сигналов или слоты для установки/удаления фоновой кисти, которую вы используете для рисования изображения. Итак, вам придется создать подкласс QTableWidgetItem и самостоятельно предоставить эти сигналы/слоты.

Пример:

class ChessItem : public QTableWidgetItem
{
    // constructor / destructor
    // other methods

public slots:
    void slotChangeBackground( const QBrush & brush ) 
    {  
        setBackground( brush );
    }
};

Обработка щелчков мышью в QTableWidget

изменить: я удалил абзац обработки событий, потому что проще использовать встроенные сигналы QTableWidget

QTableWidget предлагает сигнал щелчка по ячейке:

void QTableWidget::cellClicked ( int row, int column )  

Итак, в вашем классе Table добавьте слот, а затем подключите к нему сигнал cellClicked:

// in your Table's constructor:
connect( table, SIGNAL( cellClicked(int, int) ), this, SLOT( slotCellClicked(int,int) ) ) );
// elsewhere...
void slotCellClicked(int row, int column) {
    // handle mouse clicking here
}

Проблема, как я вижу, заключается в том, что вы не хотите просто подключать любой сигнал ol к slotChangeBackground, потому что это изменит каждый фон. Поэтому я предлагаю не использовать сигналы/слоты для изменения фона, а вместо этого использовать QTableWidget::itemAt ( int ax, int ay ) в вашем slotCellClicked(x,y) для извлечения элемента по координате, а затем вызывать для него setBackground.

person Casey    schedule 09.07.2010
comment
Спасибо за вашу помощь. да, я сделал это с помощью cellClicked, и это сработало !!! большое спасибо. - person Omid; 10.07.2010