QT 关于实现窗体移动和解决下拉框造成的窗体移动问题

本功能是为实现鼠标点击窗口的特定位置时,能够拖动窗体。具体实现代码如下

头文件重,需添加QPoint对象。

//Widget.h
QPoint diff_pos;  // 鼠标和窗口的相对位移
QPoint window_pos;
QPoint mouse_pos;

在源文件中,重写mousePressEvent与mouseMoveEvent函数。

//Widget.cpp

void Widget::mousePressEvent(QMouseEvent* event)
{
    QPoint y = event->globalPos();
    QPoint x1 = this->geometry().topLeft();
    int w=y.rx()-x1.rx();
    int h=y.ry()-x1.ry();
    if(w<=800&&h<=30)//其中800对应长度,30对应高度,可根据自己的需求进行更改
    {
        mouse_pos = event->globalPos();
        window_pos = this->pos();
        diff_pos = mouse_pos - window_pos;
    }
    else
    {
        diff_pos.rx() = 0;
        diff_pos.ry() = 0;
    }
}

void Widget::mouseMoveEvent(QMouseEvent* event)
{
    if(FillSN::GetInstance(this)->cbb_CountryTime->underMouse() && event->buttons() & Qt::LeftButton)
        return;
    if(cbb_ComId->underMouse() && event->buttons() & Qt::LeftButton)
        return;
    if(diff_pos.rx() == 0 && diff_pos.ry() == 0)
        return;
    QPoint pos = event->globalPos();
    this->move(pos - diff_pos);
}

其中由于下拉框控件QComboBox不能正确处理鼠标点击和移动事件,导致鼠标点击下拉框时,会进入mouseMoveEvent函数,但不会进入mousePressEvent函数,这将会导致鼠标点击下拉框时会造成窗体的瞬移,这个解决方法就是手动为点击下拉框事件进行处理,即在mouseMoveEvent函数中,通过过滤鼠标左键点击下拉框,从而避免函数中的pos被改变。

好的,下面是用Qt自定义表头实现表头下拉框的步骤: 1.创建一个自定义的表头类,继承自QHeaderView。 2.在自定义表头类的构造函数中,创建一个QComboBox控件,并将其添加到表头中。例如,可以使用以下代码实现: ``` MyHeaderView::MyHeaderView(Qt::Orientation orientation, QWidget *parent) : QHeaderView(orientation, parent) { m_comboBox = new QComboBox(this); m_comboBox->setEditable(true); m_comboBox->setMinimumWidth(100); connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged(int))); } void MyHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const { painter->save(); QHeaderView::paintSection(painter, rect, logicalIndex); if (logicalIndex == m_index) { QRect comboBoxRect = rect.adjusted(4, 4, -4, -4); m_comboBox->setGeometry(comboBoxRect); } painter->restore(); } ``` 其中,m_comboBox是QComboBox的指针成员变量,m_index是当前列的索引号。在paintSection()函数中,先调用父类的paintSection()函数,绘制表头。然后根据当前列的索引号,调整QComboBox的位置和大小。 3.重写mousePressEvent()函数,用于判断用户是否点击了QComboBox控件。例如,可以使用以下代码实现: ``` void MyHeaderView::mousePressEvent(QMouseEvent *event) { QHeaderView::mousePressEvent(event); int index = logicalIndexAt(event->pos()); if (index == m_index) { QRect comboBoxRect = sectionViewportPosition(index).adjusted(4, 4, -4, -4); if (comboBoxRect.contains(event->pos())) { m_comboBox->setGeometry(comboBoxRect); m_comboBox->showPopup(); } } } ``` 其中,logicalIndexAt()函数用于获取用户点击的列索引号,sectionViewportPosition()函数用于获取该列的可视位置。 4.在自定义表头类中添加一个设置下拉框选项的函数,例如: ``` void MyHeaderView::setComboBoxItems(const QStringList &items) { m_comboBox->clear(); m_comboBox->addItems(items); } ``` 在该函数中,使用QComboBox的clear()函数清空选项,然后使用addItems()函数添加新的选项。 5.在自定义表头类中添加一个槽函数,用于处理QComboBox的currentIndexChanged()信号。例如: ``` void MyHeaderView::onComboBoxIndexChanged(int index) { emit comboBoxIndexChanged(m_index, m_comboBox->currentText()); } ``` 在该函数中,使用emit关键字发送comboBoxIndexChanged()信号,该信号包含当前列的索引号和QComboBox的文本内容。 6.在主程序中,创建自定义表头对象,并将其设置为QTableView控件的表头。例如: ``` MyHeaderView *headerView = new MyHeaderView(Qt::Horizontal, ui->tableView); headerView->setComboBoxItems(QStringList() << "Option 1" << "Option 2" << "Option 3"); ui->tableView->setHorizontalHeader(headerView); connect(headerView, SIGNAL(comboBoxIndexChanged(int,QString)), this, SLOT(onComboBoxIndexChanged(int,QString))); ``` 其中,创建自定义表头对象,并设置其下拉框选项。然后,将自定义表头对象设置为QTableView控件的水平表头。最后,将comboBoxIndexChanged()信号连接到主程序中的槽函数,用于处理用户在下拉框中选择的选项。 以上就是使用Qt自定义表头实现表头下拉框的基本步骤,希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值