2010-07-09 13 views
1

我想製作一個簡單的國際象棋程序。到目前爲止,我已經使用QTableWidget製作了該板,並將這些圖片加載到了表格的單元格中。現在我想使用信號和插槽,以便當用戶單擊一個單元格,然後單擊另一個單元格時,第一個單元格的圖片將轉到第二個單元格,但是我不知道該怎麼做。使用qt中的信號/插槽替換背景圖像的問題

請注意,我不希望這些「棋子」服從真正的國際象棋規則。我只想做兩個單元格之間的圖片替換。後來我會讓他們遵守規則。

這裏是代碼。在這個代碼中只有表格的項目(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(); 
} 

回答

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) 

所以在您的表類添加一個槽,然後將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。

+0

感謝您的幫助。是的,我用cellClicked做了它,它工作! 非常感謝。 – Omid 2010-07-10 06:28:01