Я пытаюсь как-то определить, когда QPushButton щелкают правой кнопкой мыши. У меня есть MacBook, и мне интересно, представлено ли решение в этом сообщении Md. Minhazul Haque должен работать и у меня, если я использую тачпад с принудительным касанием. Я скопировал код, который он представил (создал дополнительный класс QRightClickButton), но, к сожалению, он не работает для меня.
Это мой connect ()
connect(board->dis_board[i][j], SIGNAL(rightClicked()), this, SLOT(flag()));
Где доска является объектом класса
class Board
{
private:
int size;
int bombs;
int places;
public:
std::vector<std::vector<QPushButton*>> board;
std::vector<std::vector<QPushButton*>> dis_board;
explicit Board(int size, int bombs);
void move(int x, int y);
void flag(int,int);
};
Конструктор Доска Объект класса
Board::Board(int size, int bombs) : size(size), bombs(bombs), places(size*size)
{
board.resize(size);
dis_board.resize(size);
for (int i=0; i<size; ++i)
{
board[i].resize(size);
dis_board[i].resize(size);
for(int j=0; j<size; ++j)
{
board[i][j] = new QPushButton();
dis_board[i][j] = new QPushButton();
board[i][j]->setText(" ");
dis_board[i][j]->setText(" ");
}
}
QTime time = QTime::currentTime();
qsrand((uint)time.msec());
for (int i=0; i<bombs;)
{
int x = qrand() % ((size - 1 + 1) - 0) + 0;
int y = qrand() % ((size - 1 + 1) - 0) + 0;
if(board[x][y]->text() != "x")
{
board[x][y]->setText("x");
++i;
}
}
}
И здесь у вас есть заголовок класса реального окна (я думаю, что так оно и называется, поскольку я новичок в Qt)
#ifndef GAME_H
#define GAME_H
#include <qrightclickbutton.h>
#include <QMainWindow>
#include <vector>
#include <QGridLayout>
#include "board.h"
#include <signal.h>
#include <QMouseEvent>
namespace Ui {
class Game;
}
class Game : public QMainWindow
{
Q_OBJECT
public:
explicit Game(QWidget *parent = 0, int x=0, int y=0);
~Game();
private slots:
void flag();
private:
Ui::Game *ui;
int size;
int bombs;
Board *board;
QGridLayout *grid;
};
#endif // GAME_H
И последнее, что я считаю важным, - это конструктор окна
Game::Game(QWidget *parent, int size, int bombs) :
QMainWindow(parent),
ui(new Ui::Game),
size(size),
bombs(bombs)
{
ui->setupUi(this);
grid = new QGridLayout();
board = new Board(size, bombs);
ui->verticalLayout->addLayout(grid);
for(int i=0; i<size; ++i)
{
for(int j=0; j<size; ++j)
{
grid->addWidget(board->dis_board[i][j], i, j);
connect(board->dis_board[i][j], SIGNAL(rightClicked()), this, SLOT(flag()));
}
}
}
Game::~Game()
{
delete ui;
}
void Game::flag()
{
QMessageBox msg;
msg.setText("WARNGING");
msg.exec();
QPushButton *buttonSender = qobject_cast<QPushButton*>(sender());
for(unsigned long x=0; x<board->dis_board.size(); ++x)
{
for(unsigned long y=0; y<board->dis_board.size(); ++y)
{
if(board->dis_board[x][y] == buttonSender)
{
board->flag(x,y);
return;
}
}
}
}
Также clicked () SIGNAL (левая кнопка) отлично работает с этими кнопками.