1

簡単なチェスプログラムを作りたいです。これまで、QTableWidgetを使用してボードを作成し、テーブルのセルにピース画像をロードしました。ここで、信号とスロットを使用して、ユーザーがセルをクリックしてから別のセルをクリックすると、最初のセルの断片画像が2番目のセルに移動するようにしますが、その方法がわかりません。

これらの「駒の動き」が実際のチェスのルールに従わないようにすることに注意してください。私は2つのセル間で画像の置換を行うだけです。後で私は彼らに規則に従わせるでしょう。

これがコードです。このコードでは、テーブルのitem(0,0)のみに画像があります。誰かがコードを書く方法を言うことができますか?そのアイテムをクリックしてからitem(1,1)をクリックすると、画像「1.bmp」がitem(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();
}
4

1 に答える 1

1

ここには本当に2つの質問があります。

1つ目はQTableWidgetItemを使用したシグナル/スロットに関するもので、2つ目は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を呼び出すことをお勧めします。

于 2010-07-09T14:41:33.833 に答える