2013-07-22 4 views
3

Я сделал некоторые QPushbuttons, такие как QPushButton ** btn, и я хочу знать, когда пользователь нажимает на один из них, используя QMouseEvent, вот код, но эта идея не работает вообще ни с какими идеями? ?Как использовать mousePressEvent на QPushButtons

недействительных игр :: mousePressEvent (QMouseEvent * эв) {

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

+0

Вы пытались подключить сигнал 'clicked' к слоту для обработки кликов?Возможно, вы должны обработать свою логику таким образом и указать указатель на кнопку, которую вы нажали, чтобы изменить цвет фона. –

+1

Почему бы не использовать что-то вроде этого: http://stackoverflow.com/questions/12292592/qt-stylesheet-for-custom-button-on-mouse-hovered-and-clicked? – Mat

+0

моя проблема не в таблице стилей ... – Aminiok

ответ

0

Переключите

Game::mousePressEvent(QMouseEvent *e) 

в

ApButton::mousePressEvent(QMouseEvent *e) 

, так как вы пытаетесь реализовать пресс-событие кнопки. Если вы хотите иметь момент кнопка будет нажата и не меняется поведение кнопки с этим, используйте SIGNAL SLOT соединение/вместо переопределения события (добавить в ваше творение):

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

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

использовать QButtonGroup или QSignalMapper, если вам нужно идентифицировать более одной кнопки в одном методе или использовать QObject :: sender(), но иногда это может быть сложно.

+0

как объявить i и j. вы предлагаете мне поместить эту функцию соединения в мой цикл? – Aminiok

+0

Если вы хотите, чтобы все ваши кнопки вели себя так, поместите их в свой Apputton-Class '' mousepressevent (* e) {QPushButton :: mousePressEvent (e); setStylesheet ("Somtehing"); // doSomeMore} ''. Если вы хотите, чтобы только некоторые кнопки были изменены логикой игры, если они нажаты, используйте соединение сигнал/слот. Поместите вызов '' connect() '' в ваш цикл и добавьте слот (метод под '' слотами: '' определение класса в классе) в ваш класс. В этом слоте сделайте необходимые изменения. Вообще: Вариант 1) сама кнопка будет решать, когда нужно стилизовать сам. Вариант 2) Родительский класс (Игра) сообщит кнопке об изменении. –

+0

С подключением() (сигналом/слотом) вам не требуется подкласс QPushButton. Если ваши кнопки, как правило, ведут себя по-другому, вы, вероятно, все еще хотите подкласс и используете метод, включенный в ApButton, для автоматического изменения самого стиля. Если вам нужно только нажатие/переключение/освобождение, вы также можете использовать соединение SIGNAL/SLOT в своем классе ApButton и изменить работу там. Перезапуск метода '' mousePressEvent (* e) '' был бы полезен, если вы планируете другое поведение, чем стандартное нажатие/отключение/нажатие/переключение. –

0

У меня были подобные ситуации несколько раз назад .. У меня был QDialog, и мне пришлось динамически добавлять некоторые Q PushButton .. то мне нужно знать, на какую кнопку нажал пользователь .. так что мне нужно что-то вроде:

connect(btn, SIGNAL(clicked(int)), 
     this, SLOT(handle(int))); 

, например, сигнал-слот подключения с идентификатором При нажатии кнопки и функции для обработки нажмите , Функция является одинаковой для каждой кнопки и может обрабатывать определенную кнопку из ид ..

Реализации этого достаточно просто подклассы QPushButton добавив идентификатор и новый сигнал ..

Надеется, что это какая-то помощь!

+0

спасибо, но что это за int, нажатый и дескриптор, вы имеете в виду, что я помещаю одно и то же целое число как в id, так и из-за того, что мой ApButton является ** btn ... – Aminiok

+0

Да целое число как id. и вы можете использовать std :: vector nkint

+0

, а другая проблема в том, что я тоже хочу использовать правый щелчок, и я думаю, что это невозможно с функцией соединения ... – Aminiok

0

Если Apbutton наследует QPushButton, почему бы не подключиться к clicked()?

, то вы можете позвонить QObject::sender()

На слоте:

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

, чтобы получить щелкнул buttonbutton и установить его таблицу стилей

2

Это хороший пример использования для QSignalMapper, как видно там: http://qt-project.org/doc/qt-5.0/qtcore/qsignalmapper.html#details

ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent) 
    : QWidget(parent) 
{ 
    signalMapper = new QSignalMapper(this); 

    QGridLayout *gridLayout = new QGridLayout; 
    for (int i = 0; i < texts.size(); ++i) { 
     QPushButton *button = new QPushButton(texts[i]); 
     connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
     signalMapper->setMapping(button, texts[i]); 
     gridLayout->addWidget(button, i/3, i % 3); 
    } 

    connect(signalMapper, SIGNAL(mapped(QString)), 
      this, SIGNAL(clicked(QString))); 

    setLayout(gridLayout); 
} 

В этом примере каждая кнопка идентифицируется по названию, как QString. Mapper позволяет вам получить заголовок соответствующей кнопки при нажатии на один из них.

Смежные вопросы