Qt之关于Label使用(下划线,事件跳转)

日常小知识点总结:

1、Label的文字下部分下划线:

ui->label->setText("<u>日期</u>");


2、QLabel实现点击跳转即实现button功能:

1)网上找的QLabel单击事件

在解决问题过程中出现的曲折,做出了单击跳出对话框,但是意外发现点击其他区域也跳转,过程首先在,h中定义了一个clicked()信号:

signals:
    void clicked();

同时,声明了一个槽函数:

private slots:
    void slotclicked();

主函数中:

void MainWindow::slotclicked()
{
   QMessageBox::information(NULL,QString::fromLocal8Bit("点击"),QString::fromLocal8Bit("牛逼吗?"),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);

}

在保护成员函数中定义:

protected:    
    void mousePressEvent(QMouseEvent *event);

主函数中写了函数:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
       emit clicked();
    }
}

信号槽连接:

    connect(this,SIGNAL(clicked()),this,SLOT(slotclicked()));

运行代码,出现界面点击实现单击消息框,但是当我点击其他地方时,一下子发现点击界面也出现消息框,这就问题来了。

思考了一会儿,仔细将代码分析一遍终于,所谓的单击label事件事实上操作的是鼠标事件,检测鼠标事件,但检测到鼠标事件时跳出消息框。这就一下子勾起我的好奇心了,我该怎么解决呢??

经过查询了帮助文档和一些资料,确定使用鼠标双击事件

解决方法:(1)鼠标双击事件mouseDoubleClickEvent

帮助文档对双击事件定义如下:

     void Q3ScrollView::mouseDoubleClickEvent ( QMouseEvent * e ) [virtual protected]     

     Reimplemented from QWidget::mouseDoubleClickEvent().

接上面函数写:

void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(!rect().contains(event->pos()))
       return;
    if(event->button()==Qt::LeftButton)
    {
       emit clicked();
    }
}

虽然实现单击界面不跳出对话框,但是这种仍然是检测鼠标事件,不完美!!!


解决方法:(2)事件过滤法解决(QObject::eventFilter)

分析:点击鼠标弹出事件是正确的思路,但是没有过滤掉其他界面单击事件即没有指定控件弹出事件,Object有这样的一函数,事件过滤:

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

watched为需要操作的控件,event是需要过滤的事件;

因此,需要在鼠标事件外层嵌套一层,操作代码如下:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == ui->label)//需要操作label
    {
        if(event->type() == QEvent::MouseButtonPress)//判断事件类型
       {
          QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
          if(mouseEvent->button() == Qt::LeftButton)
          {
             QMessageBox::information(NULL,QString::fromLocal8Bit("点击"),QString::fromLocal8Bit("牛逼吗?"),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
             return true;
          }
          return false;
        }
        return false;
    }
    return QMainWindow::eventFilter(obj, event);  
}
重写了eventFilter函数后,还需要安装过滤器需要调用QObject::installEventFilter()函数
    ui->label->setText("<u>耗子</u>");
    ui->label->installEventFilter(this);//安装事件过滤

运行结果成功,效果图如下:

Qt之关于Label使用(下划线,事件跳转)

解决方法:(3)将button设置为透明(transparant),即可表示label,哈哈哈