Qt - MacBook с сенсорной панелью «правой кнопкой мыши» - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь как-то определить, когда 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 (левая кнопка) отлично работает с этими кнопками.

...