Qt 使用 isAutoRepeat() 处理 QPushButton Autorepeat() 行为
Qt handling QPushButton Autorepeat() behavior with isAutoRepeat()
我是 QT 的新手,正在制作一个与预先存在的 gui 交互的小部件。我想让我的小部件在用户按下按钮时连续输出一个信号,然后在释放按钮时连续输出另一个信号。
通过启用自动重复,我可以让小部件在用户按下按钮时输出我的信号,但是,输出信号在 pressed() 和 released() 之间切换。例如。
<>
输出:
* 按下信号
* 释放信号
* 按下信号
* 发布信号
我看到有人问过这个关于 keyPressEvents 的问题,但我不确定如何访问按钮的 isAutoRepeat()。有人可以给我建议吗?
一种方法是您可以使用计时器对象来实现此目的。下面是示例,当按下和释放按钮时,将 运行 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_2_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();
}
我是 QT 的新手,正在制作一个与预先存在的 gui 交互的小部件。我想让我的小部件在用户按下按钮时连续输出一个信号,然后在释放按钮时连续输出另一个信号。
通过启用自动重复,我可以让小部件在用户按下按钮时输出我的信号,但是,输出信号在 pressed() 和 released() 之间切换。例如。
<> 输出: * 按下信号 * 释放信号 * 按下信号 * 发布信号
我看到有人问过这个关于 keyPressEvents 的问题,但我不确定如何访问按钮的 isAutoRepeat()。有人可以给我建议吗?
一种方法是您可以使用计时器对象来实现此目的。下面是示例,当按下和释放按钮时,将 运行 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_2_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();
}