国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt鼠標(biāo)拖動控件交換布局位置

這篇具有很好參考價值的文章主要介紹了Qt鼠標(biāo)拖動控件交換布局位置。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

方法很簡單,交換鼠標(biāo)起點控件指針和鼠標(biāo)落點控件指針的值,然后重新布局

Qt鼠標(biāo)拖動控件交換布局位置

源文件

#include "widget.h"
#include<QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setMinimumSize(1000,800);
    //label = new QLabel(this);
    //label->setFixedSize(80,40);
    //label->hide();
    lay = new QGridLayout(this);
    setLayout(lay);
    lay->setSpacing(0);
    //設(shè)置表格布局行列為5*5的形式
    for(int i = 0;i <5 ;++i){
        for(int j = 0;j <5 ;++j)
        {
            qDebug() << i*5+j;
            auto label = new QLabel(QString::number(i*5+j+1));
            label->setAlignment(Qt::AlignCenter);
            label->setFont(QFont("宋體",50));
            label->setStyleSheet("border:2px groove gray");
            lay->addWidget(label,i,j,1,1);
            labels.push_back(label);
        }
    }
}
void Widget::reStartLayout()//重新布局
{
    qDebug() << lay->count();
    for(auto&w : labels){
        lay->removeWidget(w);//移除舊布局
    }
    qDebug() << lay->count();
    for(int i = 0;i <5 ;++i){//生成新布局5*5
        for(int j = 0;j <5 ;++j){
            lay->addWidget(labels[i*5+j],i,j,1,1);
        }
    }
    qDebug() << lay->count();
}
int Widget::indexByPos(const QPoint& pos)
{//根據(jù)鼠標(biāo)pos點取索引
    for(int i = 0;i <5 ;++i){
        for(int j = 0;j <5 ;++j){
            if(lay->cellRect(i, j).contains(pos)){
                qDebug() << i*5+j;
                return i*5+j;//Qlabel*索引
            }
        }
    }
    return -1;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton){
        pressIndex = indexByPos(event->pos());//拖動起點索引
    }
    QWidget::mousePressEvent(event);
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落點索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交換起點和落點的QLabel指針
                reStartLayout();
            }
            pressIndex = -1;
        }
    }
    QWidget::mouseReleaseEvent(event);
}

頭文件

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void mousePressEvent(QMouseEvent *event) ;
    void mouseReleaseEvent(QMouseEvent *event);
    int indexByPos(const QPoint& pos);
    void reStartLayout();

private:
    QGridLayout* lay;
    std::vector<QLabel*> labels;
    int pressIndex = -1;
    //QPoint move_pos;
    //QLabel* label;
};

下面是只交換控件顯示的內(nèi)容:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落點索引
            if(index!= -1 && pressIndex!= index){
             QString str1 = labels[pressIndex]->text();
             QString str2 = labels[index]->text();
                  labels[pressIndex]->setText(str2);
                  labels[index]->setText(str1);
            }
        }
    }
    QWidget::mouseReleaseEvent(event);
}

添加鼠標(biāo)貼圖,跟隨鼠標(biāo)移動:
一種實現(xiàn):重寫void paintEvent(QPaintEvent *event);方法

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落點索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交換起點和落點的QLabel指針
                reStartLayout();
            }
            pressIndex = -1;
            repaint();//立即執(zhí)行paintEvent方法
        }
    }
    QWidget::mouseReleaseEvent(event);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if (event->buttons() & Qt::LeftButton) {
        if(pressIndex!= -1){
         move_pos =  event->pos();
         repaint();
        }
    }
    QWidget::mouseReleaseEvent(event);

}

void Widget::paintEvent(QPaintEvent *event)
{
    if(pressIndex!= -1){
        QPainter painter(this);
        QPen pen; //畫筆。繪制圖形邊線,由顏色、寬度、線風(fēng)格等參數(shù)組成
        pen.setColor(QColor(0,0,255));
        painter.setPen(pen);
        painter.setBrush(QColor(79 ,79 ,79));
        painter.setRenderHint(QPainter::Antialiasing);
       // qDebug()<< event->pos().x() <<"y " << event->pos().y();
        painter.drawRect(move_pos.x()-40,move_pos.y(),80,40);
        painter.drawText(move_pos.x(),move_pos.y()+30,QString::number(pressIndex));
    }
}

另一種實現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-516029.html

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落點索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交換起點和落點的QLabel指針
                reStartLayout();
            }
            pressIndex = -1;
            if(label->isVisible())
               label->hide();
        }
    }
    QWidget::mouseReleaseEvent(event);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if (event->buttons() & Qt::LeftButton) {
        if(pressIndex!= -1){
            if(!label->isVisible())
                label->show();
         QPicture p;
         p.setBoundingRect(QRect(event->pos().x()-40,event->pos().y(),80,40));
         QPainter painter(&p);
         painter.setPen(Qt::green);
         painter.setBrush(QColor(79 ,79 ,79));
         painter.drawRect(QRect(event->pos().x()-40,event->pos().y(),80-1,40-1));
         painter.drawText(event->pos().x(),event->pos().y()+30,QString::number(pressIndex));
         label->move(event->pos().x()-40,event->pos().y());
         label->setPicture(p);
        }
    }
    QWidget::mouseReleaseEvent(event);
}

到了這里,關(guān)于Qt鼠標(biāo)拖動控件交換布局位置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • QT編寫實現(xiàn)圖片的幻燈片播放、自適應(yīng)顯示、縮放(以鼠標(biāo)位置為中心進行縮放)、拖動、重置、顯示鼠標(biāo)位置像素坐標(biāo)及RGB值、播放GIF動畫、截圖保存、批量保存、拖入文件夾遍歷所有文件

    QT編寫實現(xiàn)圖片的幻燈片播放、自適應(yīng)顯示、縮放(以鼠標(biāo)位置為中心進行縮放)、拖動、重置、顯示鼠標(biāo)位置像素坐標(biāo)及RGB值、播放GIF動畫、截圖保存、批量保存、拖入文件夾遍歷所有文件

    這個圖片查看器功能很多,是我花了不少心思,不斷優(yōu)化,不斷添加功能的成果: 1.能打開并顯示所有常用圖片格式文件,顯示鼠標(biāo)位置像素坐標(biāo)及RGB值 2.能縮放,拖動圖片,可以以鼠標(biāo)為中心滾動滾輪進行縮放 3.右擊可彈出菜單欄,菜單包括:適應(yīng)寬度,適應(yīng)窗口,原圖大

    2024年02月10日
    瀏覽(39)
  • django boostrap html實現(xiàn)可拖拽的左右布局,鼠標(biāo)拖動調(diào)整左右布局的大小或占比

    django boostrap html實現(xiàn)可拖拽的左右布局,鼠標(biāo)拖動調(diào)整左右布局的大小或占比

    ? ? ? 最近需要在Django項目中,實現(xiàn)一個左右布局的html頁面,頁面框架使用的是boostrap。但這個布局不是簡單的左右分欄布局,而是需要實現(xiàn)可以通過鼠標(biāo)拖拽的方式動態(tài)調(diào)整左右兩側(cè)布局的大小和占比。效果大致如下: ? ? ? ? 一開始,頁面分為左右兩塊布局: ? 鼠標(biāo)放

    2024年02月13日
    瀏覽(21)
  • Qt:界面實時響應(yīng)鼠標(biāo)拖動繪制

    Qt:界面實時響應(yīng)鼠標(biāo)拖動繪制

    采用雙緩沖實現(xiàn)界面實時響應(yīng)鼠標(biāo)的拖動繪制。 思想如下:首先需要兩張畫布pix和tempPix,他們都是QPixmap實例;pix用來保存初始界面或上一階段以完成的繪制;tempPix用來作為鼠標(biāo)拖動時的實時界面繪制;當(dāng)鼠標(biāo)左鍵按下后拖動時每次都將將pix賦值給tempPix,然后用tempPix進行繪

    2024年02月11日
    瀏覽(22)
  • 【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實時顯示,動態(tài)更新,支持鼠標(biāo)交互等操作】

    【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實時顯示,動態(tài)更新,支持鼠標(biāo)交互等操作】

    十字線和顯示坐標(biāo)實現(xiàn) 在.h文件中定義十字線lineitem變量和坐標(biāo)textitem變量 在Cpp文件中初始化 然后定義鼠標(biāo)事件,在鼠標(biāo)進入時顯示,移出時隱藏,移動時顯示。 其他實現(xiàn)請參考具體代碼 ChartDrawer.h文件 ChartDrawer.cpp 文件 具體使用代碼如下 1、初始化類對象,并加入界面布局

    2023年04月23日
    瀏覽(30)
  • 【Qt】Qt無邊框窗口(鼠標(biāo)點擊自定義標(biāo)題欄)可拖動

    【Qt】Qt無邊框窗口(鼠標(biāo)點擊自定義標(biāo)題欄)可拖動

    隱藏掉標(biāo)題欄后,默認(rèn)情況下窗口無法被鼠標(biāo)拖動的,需要自己處理鼠標(biāo)事件,移動窗口達(dá)到拖動效果,但是又不想要鼠標(biāo)點擊整個窗口都可以拖動,只需要鼠標(biāo)點擊自定義的標(biāo)題欄時可拖動 具體步驟如下: 類外初始化 通過鼠標(biāo)點擊事件,判斷鼠標(biāo)是否在標(biāo)題欄,如果是,

    2024年02月12日
    瀏覽(22)
  • Qt鼠標(biāo)拖動繪制基本幾何圖形

    Qt鼠標(biāo)拖動繪制基本幾何圖形

    用Qt鼠標(biāo)事件實現(xiàn)基本幾何圖形的繪制,支持直線、矩形、圓形、橢圓。后期可以在此基礎(chǔ)上進行擴展。 效果圖 實現(xiàn) 本示例使用QGraphics體系來實現(xiàn),因為要移動對象,所以生成的圖形必須是一個單獨的對象,鼠標(biāo)拖動繪制的過程是在臨時層中完成,release后生成一個矢量的圖

    2024年02月13日
    瀏覽(26)
  • Qt布局管理(布局控件)

    Qt布局管理(布局控件)

    實際開發(fā)中,一個界面上可能包含十幾個控件,手動調(diào)整它們的位置既費時又費力。作為一款成熟的 GUI 框架,Qt 提供了很多擺放控件的輔助工具(又稱布局管理器或者布局控件),它們可以完成兩件事: 自動調(diào)整控件的位置,包括控件之間的間距、對齊等; 當(dāng)用戶調(diào)整窗口

    2024年02月04日
    瀏覽(21)
  • QT QChartView 鼠標(biāo)隨動 十字線 縮放 平移 拖動

    QT QChartView 鼠標(biāo)隨動 十字線 縮放 平移 拖動

    QChart添加跟隨鼠標(biāo)的十字線_x縣豆瓣醬的博客-CSDN博客_qchart鼠標(biāo)跟蹤線 最近在做這么一個東西,需要十字線。我參考自上面的博主的內(nèi)容,但是他沒寫全。很多人不知道這個QGraphicsLineItem 是怎么創(chuàng)建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。 下面試我的效果,實現(xiàn)

    2024年02月12日
    瀏覽(17)
  • Qt - 控件和布局

    https://www.bilibili.com/video/BV1g4411H78N?p=6 添加控件到窗口,需要添加內(nèi)容到 mywidget.cpp 按鈕控件常用API 創(chuàng)建 QPushButton * btn = new QPushButton 設(shè)置父親 setParent(this) 設(shè)置文本 setText(\\\"文字\\\") 設(shè)置位置 move(寬,高) 重新指定窗口大小 resize 設(shè)置窗口標(biāo)題 setWindowTitle 設(shè)置窗口固定大小 setFixed

    2024年02月16日
    瀏覽(25)
  • Qt使用代碼放置控件并布局

    Qt使用代碼放置控件并布局

    ????????上一章中我們從頭一步一步地新建項目并運行了窗口,本章就正式踏入Qt界面編程之路。在本章節(jié),我們先用代碼編寫界面,進行簡單的控件放置,然后用代碼進行布局;之后使用Qt?Designer進行控件放置和界面布局,這使得復(fù)雜界面的設(shè)計變得簡單起來。 ? ? ?

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包