使用qt中的信号/插槽替换背景图像时出现问题

使用qt中的信号/插槽替换背景图像时出现问题,qt,background,signals-slots,qtablewidget,Qt,Background,Signals Slots,Qtablewidget,我想做一个简单的国际象棋程序。到目前为止,我已经使用QTableWidget制作了电路板,并将这些图片加载到表的单元格中。现在我想使用信号和插槽,这样当用户点击一个单元格,然后点击另一个单元格时,第一个单元格中的图片就会转到第二个单元格,但我不知道怎么做 请注意,我不希望这些“棋步”遵守真正的国际象棋规则。我只想在两个单元格之间进行图片替换。以后我会让他们遵守规则 这是代码。在此代码中,只有表的项(0,0)有图片。有人能告诉我如何写一个代码,当我点击那个项目,然后点击项目(1,1),图片“1.b

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

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

这是代码。在此代码中,只有表的项(0,0)有图片。有人能告诉我如何写一个代码,当我点击那个项目,然后点击项目(1,1),图片“1.bmp”就会变成项目(1,1)的背景吗

#包括
#包括“mainwindow.h”
#包括
#包括
#包括
类表:公共QWidget
{
Q_对象
公众:
表(QWidget*parent=0);
插槽:
//??????
};
表::表(QWidget*父项)
:QWidget(父项)
{
QHBoxLayout*hbox=新的QHBoxLayout(本);
QTableWidget*table=新的QTableWidget(8,8,这个);
表->设置固定尺寸(900900);
table->horizontalHeader()->setDefaultSectionSize(100);
table->verticalHeader()->setDefaultSectionSize(100);
table->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
table->verticalHeader()->setResizeMode(QHeaderView::Fixed);
QString fileName=“/1.bmp”;
QPixmap pic(文件名);
QBrush刷(pic);
QTableWidgetItem*item=新的QTableWidgetItem();
项目->立根(刷);
表->设置项(0,0,项);
hbox->addWidget(表格);
setLayout(hbox);
}
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
表格;
table.show();
返回app.exec();
}

这里有两个问题

第一个是关于QTableWidgetItem的信号/插槽,第二个是关于处理QTableWidget上的鼠标单击

向QTableWidgetItem上的插槽发送信号

  • 注意:我不建议这样做,请通读到底*
使用信号和插槽要求发出信号的对象具有类定义中定义的信号。同样,接收插槽的对象必须在类定义中声明该插槽

你会注意到(在Qt文档上)没有信号或插槽来设置/删除你用来画图的背景画笔。因此,您必须将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,因为这会改变每个背景。因此,我建议不要使用信号/插槽来更改背景,而是在
slotCellClicked(x,y)
中使用
QTableWidget::itemAt(int ax,int ay)
在坐标处检索项目,然后调用setBackground

第一个是关于QTableWidgetItem的信号/插槽,第二个是关于处理QTableWidget上的鼠标单击

向QTableWidgetItem上的插槽发送信号

  • 注意:我不建议这样做,请通读到底*
使用信号和插槽要求发出信号的对象具有类定义中定义的信号。同样,接收插槽的对象必须在类定义中声明该插槽

你会注意到(在Qt文档上)没有信号或插槽来设置/删除你用来画图的背景画笔。因此,您必须将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,因为这会改变每个背景。因此,我建议不要使用信号/插槽来更改背景,而是在
slotCellClicked(x,y)
中使用
QTableWidget::itemAt(int ax,int ay)
在坐标处检索项目,然后调用setBackground。

感谢您的帮助。是的,我用cellClicked做了,而且成功了!!!非常感谢。谢谢你的帮助。是的,我用cellClicked做了,而且成功了!!!非常感谢你。