3

QPushButton **btn のようないくつかの QPushbuttons を作成しました。ユーザーが QMouseEvent を使用してそのうちの 1 つをクリックしたときを知りたいのですが、コードはここにありますが、このアイデアはまったく機能しません。

void Game::mousePressEvent(QMouseEvent *ev) {

if(ev->button() == Qt::LeftButton)
{
    btn[ev->x()][ev->y()].setStyleSheet("background-color : black;");
}
else
{
   btn[ev->x()][ev->y()].setStyleSheet("background-color : red;");
}

それ以外の部分は右クリック用で、ボタンを生成するコードは次のとおりです

void Game::MakeButton()
{

    btn = new ApButton*[column];
    hrztl = new QHBoxLayout[column];
    hrztl->setSpacing(0);
    for(int i=0; i<column;i++)
    {
        btn[i] = new ApButton[row];
        for(int j=0; j<row; j++)
        {
            btn[i][j].setRowCol(i,j);
            btn[i][j].setFixedSize(50,50);
            hrztl[i].addWidget(&btn[i][j]);
        }
        ui->MainLayout->addLayout(&hrztl[i]);
    }
    ui->MainLayout->setSpacing(0);
}

ApButton は QPushButton を継承するクラスです

4

4 に答える 4

0

あなたのスイッチ

Game::mousePressEvent(QMouseEvent *e) 

ApButton::mousePressEvent(QMouseEvent *e)

ボタンの Press イベントを実装しようとしているためです。ボタンが押された瞬間だけを残し、これでボタンの動作を変更したくない場合は、イベントを再実装する代わりに SIGNAL/SLOT 接続を使用します (作成に追加します)。

connect(btn[i][j], SIGNAL(pressed()), this, SLOT(slotButtonPressed());

void Game::slotButtonPressed(){
    //doSomething
}

単一のメソッドで複数のボタンを識別する必要がある場合、または QObject::sender() を使用する必要がある場合は、QButtonGroup または QSignalMapper を使用しますが、これは時々注意が必要です。

于 2013-07-22T12:46:21.540 に答える
0

Apbutton が QPushButton を継承している場合、clicked() に接続しないのはなぜですか?

その後、 QObject::sender()を呼び出すことができます

スロット:

ApButton *but = dynamic_cast<ApButton*>QObject::sender()
if(but)
{
   but->setStyleSheet("background-color : black;");
}

クリックされたボタンボタンを取得し、そのスタイルシートを設定する

于 2013-07-22T12:45:44.710 に答える