нажатие не работает при переопределении mousePressEvent и mouseReleaseEvent - PullRequest
1 голос

Итак, я хочу добавить несколько стилей к моей кнопке. Итак, я создал класс, производный от QPushButton. Я переопределил функции mousePressEvent и mouseReleaseEvent. Все идет нормально. Все работает как положено и кнопки меняют цвет при нажатии и отпускании. Проблема возникает, когда в моем MainWindow я пытаюсь реализовать on_button_clicked (). Это просто не сработает.

Я немного поэкспериментировал с event-> accept и event-> ignore. это не сработало.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::on_characters_clicked()
{
    qDebug("Hello");
}

void Button::mousePressEvent(QMouseEvent* event)
{
    setStyleSheet(defaultStyle + "Background-color: gray;");
}

void Button::mouseReleaseEvent(QMouseEvent* event) {
    setStyleSheet(defaultStyle + "Background-color: darkgray; border: 1px solid gray; color: white;");
}

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

1 Ответ

1 голос
/ 08 мая 2019

Когда вы переопределяете метод, вы изменяете поведение класса, в этом случае сигнал clicked выдается в mouseReleaseEvent, но mouseReleaseEvent вызывается только в том случае, если mousePressEvent принимает событие, но при изменении кода вы его исключили.Решение состоит в том, чтобы вызвать реализацию родительского элемента.

void Button::mousePressEvent(QMouseEvent* event)
{
    setStyleSheet(defaultStyle + "Background-color: gray;");
    QPushButton::mousePressEvent(event);
}

void Button::mouseReleaseEvent(QMouseEvent* event) {
    setStyleSheet(defaultStyle + "Background-color: darkgray; border: 1px solid gray; color: white;");
    QPushButton::mouseReleaseEvent(event);
}

С другой стороны, я не вижу необходимости переопределять методы mousePressEvent, поскольку таблица стилей Qt поддерживает псевдо-состояния * 1005.*:

setStyleSheet(R"(
    Button{
      // default styles
      background-color: darkgray; 
      border: 1px solid gray; 
      color: white;
    }
    Button::presed{
      // default styles
      background-color: gray;
    }
)");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...