此篇,为零散记录一些事件相关的东西。留作自己的笔记,各位大佬看官,别笑我。
(1)对于一些QSpinBox或者一些QComboBox,如果大家不想让其用滚轮去切换值,达到一个防误触的效果的话,可以做一个事件过滤,如下
bool SystemSetupWidget::eventFilter(QObject* watched, QEvent*event)
{
if (watched->metaObject()->className() == QString("QSpinBox") || watched->metaObject()->className() == QString("QComboBox"))
{
if (event->type() == QEvent::Wheel)
{
return true;
}
}
return QWidget::eventFilter(watched,event);
}
知识点:事件过滤器、元对象系统。
(2)如果咱们的软件想做成多国语言切换的话,除了用QT自带的翻译官ts文件以外,下面不妨是一种思路。
首先,我们将界面部署与控件文字翻译分开,头文件如下
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow(){};
private:
int m_language; //成员变量用于记录语言 0为中文 1为英语
QLineEdit *lineText; //用于显示当前语言的文本框
QPushButton *btn; //点击就切换语言的按钮
void setupUi(); //部署界面
void retranslateUi(); //翻译函数,对界面的文字进行初始化或重新翻译
protected:
void changeEvent(QEvent *event) override;
};
#endif // MAINWINDOW_H
然后我们在构造函数中,将m_language初始化为0,然后分别执行setupUi和retranslateUi函数
构造函数代码如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->resize(500,250);//重置界面大小
m_language=0;//初始化语言 0中文,1英文
setupUi();//初始化界面
retranslateUi();//对界面文字进行初始化或翻译
}
setupUi函数就是对界面的部署,代码如下:
void MainWindow::setupUi()
{
lineText=new QLineEdit(this); //创建一个文本框
lineText->setReadOnly(true); //设置文本框只读
btn=new QPushButton(this); //创建一个按钮
btn->move(200,0); //将按钮移动到坐标(200,0)处
//设置按钮点击事件
connect(btn,&QPushButton::clicked,[this](){
m_language = m_language==1? 0:1;
QTranslator translator;
qApp->installTranslator(&translator); //重点是这个函数!!
});
}
retranslateUi代码如下:
void MainWindow::retranslateUi()
{
if(m_language==1)//语言为英语
{
lineText->setText("English");
btn->setText("Change Language");
}
else //语言为中文
{
lineText->setText("中文");
btn->setText("切换");
}
}
然后我们通过changeEvent来截取到语言切换事件,代码如下:
void MainWindow::changeEvent(QEvent *event)
{
if(event->type()==QEvent::LanguageChange){
retranslateUi();//截取到语言切换时间,执行翻译函数
}
}
知识点:其实我想表达的只是QT中如果触发installTranslator,Qt 框架会自动发送 LanguageChange事件,然后咱们可以通过changeEvent来截取到这个LanguageChange事件,对界面进行重新翻译。