这是我在写 跳棋时候遇到的,问题当时 我要传递的是一个数组,在窗口之间传递数组.
关于信号槽 机制请点这里.
注意:信号和槽机制在QObject中就实现了,可以实现在任意从QObject中继承的子类中。
我要演示的是一个 窗口之间传递 数据的信号槽实现,这只是跳棋代码中的一部分 关键代码
主函数如下:
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(pic);
QApplication a(argc, argv);
MainWindow *w=new MainWindow();
choose *c=new choose();
w->show();
QObject::connect(w,SIGNAL(choose_open()),c,SLOT(show()));
QObject::connect(c,SIGNAL(doPlayer(vector )),w,SLOT(setChessBoard(vector )));
QObject::connect(w->getBoard(),SIGNAL(gameOver(int)),w,SLOT(gameOver(int)));
return a.exec();
}
choose类:
声明:
private:
Ui::choose *ui;
vector players ;
signals:
void doPlayer(vector );
实现:
void choose::on_pushButton_clicked()
{
players.resize(6);
if(ui->lineEdit->text()!=""&&ui->lineEdit_2->text()!=""){
players[0].setPlayer(ui->lineEdit->text(),(int)ui->checkBox->isChecked());
players[1].setPlayer(ui->lineEdit_2->text(),(int)ui->checkBox_2->isChecked());
if(!((int)ui->checkBox->isChecked())&&!((int)ui->checkBox_2->isChecked())){
QMessageBox::about(this,"Needed","you must choose at least one man");
}
else{
emit doPlayer(players);// 只是在此处发布这个消息 players 在上面接收了数据
close();
}
}
else{
QMessageBox::about(this,"Needed","you must input the First two players");
}
}
MainWindow类:
private slots:
void setChessBoard(vector );
实现:
void MainWindow::setChessBoard(vector players){
this->board->setChess(players);
this->board->newGame();
ui->gameBegin->setDisabled(1);
ui->currentLongest->setDisabled(0);//使得三个提示策略 可以使用
ui->nextLess->setDisabled(0);
ui->nextLongest->setDisabled(0);
ui->getAnimation->setDisabled(1);//读取动画文件 不可使用
}这样就实现了 vector players 的传递 其中 player是另一个自定义类。