1

我想做一个简单的国际象棋程序。到目前为止,我已经使用 QTableWidget 制作了电路板并将图片加载到表格的单元格中。现在我想使用信号和插槽,这样当用户单击一个单元格然后单击另一个单元格时,第一个单元格的图片会转到第二个单元格,但我不知道该怎么做。

请注意,我不希望这些“棋子移动”遵守真正的国际象棋规则。我只需要在两个单元格之间进行图片替换。以后我会让他们遵守规则。

这是代码。在此代码中,只有表的 item(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();
}
4

1 回答 1

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。

于 2010-07-09T14:41:33.833 回答