QT学习笔记之事件(持续更新)

本文介绍了如何在Qt应用中防止QSpinBox和QComboBox的滚动事件误触,使用事件过滤器实现防误操作。同时,详细讲解了如何使用Qt的翻译功能,包括ts文件和自定义事件处理(LanguageChange)以实现在不同语言间的切换。
摘要由CSDN通过智能技术生成

此篇,为零散记录一些事件相关的东西。留作自己的笔记,各位大佬看官,别笑我。

(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事件,对界面进行重新翻译。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值