Qt обрабатывает поведение QPushButton Autorepeat() с помощью isAutoRepeat()

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

Включив автоповтор, я могу заставить виджет выводить мой сигнал, пока пользователь нажимает кнопку, однако выходной сигнал переключается между Press() и Release(). НАПРИМЕР.

‹> Выходы: * сигнал нажатия * сигнал отпускания * сигнал нажатия * сигнал отпускания

Я видел, как этот вопрос задавали о keyPressEvents но я не уверен, как получить доступ к isAutoRepeat() для кнопок. Может ли кто-нибудь дать мне совет по этому поводу?


person scott-eddy    schedule 05.02.2016    source источник
comment
вам гораздо лучше написать свою пользовательскую кнопку.   -  person user3528438    schedule 05.02.2016
comment
Можете ли вы объяснить цель непрерывного сигнала, когда он выпущен? Какой компонент должен знать о состоянии кнопки (т.е. описать ранее существовавшее требование к графическому интерфейсу)? Вы понимаете, что такой механизм означает, что кнопка каждый раз будет срабатывать тот или иной сигнал? можете ли вы объяснить X, а не Y?   -  person UmNyobe    schedule 05.02.2016


Ответы (1)


Один из способов - вы можете использовать объект таймера для достижения этой цели. Ниже приведен пример, который запустит 2 слота при нажатии и отпускании кнопки. Комментарий к коду объяснит подробно. когда кнопка нажата и отпущена, текстовое поле покажет непрерывное время в миллисекундах. Таймер — это объект, который будет выдавать сигнал timeout() в заданном интервале. Нам нужно останавливать и запускать альтернативные таймеры в сигнале нажатия/отпускания кнопки. Это приложение создано с помощью мастера QT Creator "QT Widgets Application". Надеюсь, это поможет.

// Заголовочный файл

    class MainWindow : public QMainWindow{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    //Button slots
    void on_pushButton_pressed(); //Continuous press 
    void on_pushButton_released(); //Continuous release
    void on_pushButton
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);
    //Parent object will take care of the deallocation of the 2 timer objects
    t1 = new QTimer(this);
    t2 = new QTimer(this);
    //Interval to the timer object
    t1->setInterval(10);
    t2->setInterval(10);
    //Signal slot for the timer
    this->connect(t1,SIGNAL(timeout()),this,SLOT(timer1_action()));
    this->connect(t2,SIGNAL(timeout()),this,SLOT(timer2_action()));
}
MainWindow::~MainWindow(){
    delete ui;
}
void MainWindow::on_pushButton_pressed(){
    //starting and stoping the timer
    t2->stop();
    t1->start();
    //date time when pressed
    dt1 = QDateTime::currentDateTime();
}
void MainWindow::on_pushButton_released(){
    //starting and stoping the timer
    t1->stop();
    t2->start();
    //date time when pressed
    dt2 = QDateTime::currentDateTime();
}
void MainWindow::timer1_action(){
    ui->txtTimer1->setPlainText("Button Pressed for " + QString::number(dt1.msecsTo(QDateTime::currentDateTime())) + " Milli Seconds");
}
void MainWindow::timer2_action(){
    ui->txtTimer2->setPlainText("Button Released for " + QString::number(dt2.msecsTo(QDateTime::currentDateTime())) + " Milli Seconds");
}
void MainWindow::on_pushButton_2_clicked(){
    //stoping both the timer
    t1->stop();
    t2->stop();
}
clicked(); //stop both the timer //QTimer timeout actions void timer1_action(); void timer2_action(); private: Ui::MainWindow *ui; //Timer object QTimer *t1, *t2; //Date time object for testing QDateTime dt1,dt2; };

//файл CPP

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);
    //Parent object will take care of the deallocation of the 2 timer objects
    t1 = new QTimer(this);
    t2 = new QTimer(this);
    //Interval to the timer object
    t1->setInterval(10);
    t2->setInterval(10);
    //Signal slot for the timer
    this->connect(t1,SIGNAL(timeout()),this,SLOT(timer1_action()));
    this->connect(t2,SIGNAL(timeout()),this,SLOT(timer2_action()));
}
MainWindow::~MainWindow(){
    delete ui;
}
void MainWindow::on_pushButton_pressed(){
    //starting and stoping the timer
    t2->stop();
    t1->start();
    //date time when pressed
    dt1 = QDateTime::currentDateTime();
}
void MainWindow::on_pushButton_released(){
    //starting and stoping the timer
    t1->stop();
    t2->start();
    //date time when pressed
    dt2 = QDateTime::currentDateTime();
}
void MainWindow::timer1_action(){
    ui->txtTimer1->setPlainText("Button Pressed for " + QString::number(dt1.msecsTo(QDateTime::currentDateTime())) + " Milli Seconds");
}
void MainWindow::timer2_action(){
    ui->txtTimer2->setPlainText("Button Released for " + QString::number(dt2.msecsTo(QDateTime::currentDateTime())) + " Milli Seconds");
}
void MainWindow::on_pushButton_2_clicked(){
    //stoping both the timer
    t1->stop();
    t2->stop();
}

введите здесь описание изображения

person Jeet    schedule 05.02.2016