【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置

往期回顾

【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客

【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客

【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置

这里我们主要是需要明确Qt的坐标系组成,熟悉相关相对绝对函数即可。

一、鼠标位置基本概念

1、桌面原点(0, 0)

桌面原点(0, 0),在桌面左上角。

2、应用程序原点(0,0)

应用程序原点(0,0),在应用程序左上角。

一般都是x向左为正, y向下为正

3、绝对位置

相对于电脑桌面左上角的位置,也就是相对于桌面原点的位置

4、相对位置

相对于应用程序左上角的位置,也就是相对于应用程序原点的位置

二、鼠标、控件、应用程序窗口的位置函数

1、鼠标的位置

1.1●QCursor:pos()

该函数返回值为鼠标相对于桌面左上角的绝对位置

当我们重写mousePressEvent这个方法时:

1.2●mousePressEvent的参数event的位置  
(1)event-> pos()的返回值为鼠标相对于应用程序的位置

(2)event- > globalPos()返回值为相对于桌面原点的位置,绝对位置。(跟QCursor:pos()结果是一样的)

2、控件的位置 

2.1QPoint p = ui.pushButton-> pos();

返回值为相对位置,也就是按钮控件相对于应用窗口原点的位置 

2.2QPoint p = ui.pushButton-> mapToGlobal(QPoint(0, 0)); 

返回值为绝对位置,也就是按钮相对于桌面原点的绝对位置

2.3QRect rect. = ui.pushButton-rect();

这个函数的返回值为控件的大小。

3、应用程序窗口的位置

3.1QRect rect = m_pDIg-> geometry(); 

返回值为绝对位置,也就是对话框相对于桌面坐标原点的rect。

3.2QRect rect= m_pDIg-> pos();

返回值为相对位置。

3.3QRect rect = m_pDlg-> rect);

返回值为应用窗口的大小 

三、示例

我们通过调用这一系列方法,实现点击鼠标时控制台打印输出对应被点击位置的坐标。

1、最终效果

2、完整实现代码

void Widget::mousePressEvent(QMouseEvent *event)
{
    qDebug() << QCursor::pos();  //鼠标绝对位置,相对于桌面左上角的位置

    //鼠标相对于应用程序的位置,相对位置
    qDebug() << "event->pos()         " << event->pos();
    //鼠标相对于桌面原点的位置,绝对位置
    qDebug() << "event->globalPos()   " << event->globalPos();
}

void Widget::on_pushButton_clicked()
{
    //按钮控件相对于应用窗口原点的位置
    qDebug() << u8"控件相对位置" << ui->pushButton->pos();

    //按钮相对于桌面原点的绝对位置
    QPoint jPos = ui->pushButton->mapToGlobal(QPoint(0,0));
    qDebug() << u8"控件绝对位置" << jPos;

    //控件的大小,长*宽的大小
    QRect rect = ui->pushButton->rect();
    qDebug() << rect;

    //窗口相对于桌面坐标原点的位置
    qDebug() << u8"窗口绝对位置" << this->geometry();  // 绝对位置
    
    //窗口的大小,长*宽的大小
    qDebug() << u8"窗口矩形" << this->rect();

    //TempDialog *dlg = new TempDialog(this);
    std::unique_ptr<TempDialog> dlg(new TempDialog(this));
    
    //如何让弹出的对话框位置在按钮左边对齐
    dlg->move(jPos.x() - dlg->width(), jPos.y());

    dlg->exec();
}

注意:

这里用了一个智能指针,这个要说一下,由于我们是自己创建了一个TempDialog类,如果不用智能指针,那么关闭窗口后他是不会自动销毁的,就会造成内存泄漏

当然如果创建的时候指定了this,那么后面关闭对话框时不会析构,但是关闭窗口时就会把对话框一起析构掉,也不会出现内存泄漏问题。

推荐还是用智能指针,就不用考虑内存泄漏的问题了。


以上,就是鼠标、控件、应用程序的位置简单介绍

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt Designer是一个可视化的界面设计工具,它可以帮助我们快速创建和布局用户界面。虽然Qt Designer提供了很多内置的件供我们使用,但有时候我们可能需要自定义件来满足特定的需求。 要自定义件,首先需要创建一个新的Qt类来定义件的行为和外观。可以通过继承现有的Qt件类(如QWidget、QLabel等)或自定义件基类来实现。在这个新类中,我们可以重写父类的方法,添加新的属性和信号槽,并根据需要实现自定义的绘制、事件处理等功能。 一般情况下,自定义件需要在Qt Designer中进行注册,以便在设计器中使用。在新类中添加一个静态方法(通常命名为registerWidget),利用QDesignerWidgetInterface::registerCustomWidget函数将自定义件注册到Qt Designer中。 注册后,在Qt Designer中就可以使用这个自定义件了。可以将其拖放到界面上,并通过属性编辑器调整件的属性。如果需要处理件的信号槽,也可以在信号槽编辑器中进行设置。 总结起来,自定义件需要以下步骤: 1. 创建一个新的Qt类来定义定义件。 2. 根据需要继承现有的Qt件类或自定义件基类。 3. 在新类中重写父类的方法,添加新的属性和信号槽。 4. 在新类中添加一个静态方法来注册自定义件到Qt Designer中。 5. 在Qt Designer中使用自定义件,并根据需要进行属性和信号槽的设置。 希望以上内容对您有帮助!如果有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值