多文本框输入,左右列表元素拖动移动

Demo1:文本框,按键赋值,

页面有2个输入框,10个数字按键。
禁用按键的聚焦功能,仅保留2个输入框的聚焦。

private:
    void Init();
    int whoInput; //1手机号,2卡号,0默认值
void Widget::Init(){
    whoInput = 0;
    connect(ui->btn0, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn1, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn2, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn3, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn4, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn5, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn6, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn7, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn8, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
    connect(ui->btn9, SIGNAL(clicked(bool)), this,SLOT(doProcesClickNum(bool)));
}

void Widget::doProcesClickNum(bool){
    //QPushButton* btn = (QPushButton*)this->sender();
    QPushButton* btn = qobject_cast(QPushButton*)(this->sender());
    if(btn == NULL) return;
    QString text = btn->text();
    if(ui->ledit_phone->hasFocus()){ // 谁聚焦了
        QString oldText = ui->ledit_phone->text();
        oldText.append(text);
        ui->ledit_phone->setText(oldText);
    } else if(ui->ledit_bank->hasFocus()){
        QString oldText = ui->ledit_bank->text();
        oldText.append(text);
        ui->ledit_bank->setText(oldText);
    }
}

Demo2:QListWidget值切换,拖动改变值。

左右各显示一个列表,中间显示2个按键(A->B, B-A).

void Dialog::Init(){
//  QListWidgetItem *item1 = new QListWidgetItem(QIcon(":/new/prefix/image/about.png"),"关于");
//  ui->listA->addItem(item1);
    QStringList fruit;
    fruit << "Apple" << "Bananan" << "Tomato" <<"Bear" << "Orange" << "WaterMalen";
    ui->listA.addItems(fruit);  
    
    QStringList game;
    game << "篮球"<< "足球"<< "排球"<< "棒球"<< "橄榄球";
    ui->listB.addItems(game);
}
void MoveCurrentItem(QListWidget *src, QListWidget* target);
void Dialog::MoveCurrentItem(QListWidget *source, QListWidget* target){
    QListWidgetItem *selectItem = source->currentItem()
    if(selectItem != NULL) { // 当前选中item
        QListWidgetItem newItem = selectItem->clone();
        target->addItem(newItem); //移动到目标列表
        target->setCurrentItem(newItem); //设置选中聚焦
        delete selectItem; //删除原source中item。
    }
    
}
void Dialog::on_btn_atob_clicked() {
    MoveCurrentItem(ui->listA, ui->listB);
}
void Dialog::on_btn_btoa_clicked() {
    MoveCurrentItem(ui->listB, ui->listA);
}

//mylistWidget.h
#include <QWidget>
#include <QListWidget>
#include <QMimeData>
#include <QMouseEvent>
#include <QDragEnterEvent>
#include <QDropEvent>


class myListWidget : public QListWidget
{
    Q_OBJECT
public:
    explicit myListWidget(QWidget *parent =0);
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void dragEnterEvent(QDragEnterEvent *e);
    void dragMoveEvent(QDragMoveEvent *e);
    void dropEvent(QDropEvent *e);
private:
    QListWidgetItem * currentItem;  
    bool isDrop;
    QPoint start;
};


//myistWidget.cpp
#include "mylistWidget.h"
#include <QApplication>

myListWidget::myListWidget(QWidget *parent) : QListWidget(parent)
{   //构造函数
    this->setAcceptDrops(true);
    currentItem = NULL;
    isDrop = false;
}
//按下鼠标左键。
void myListWidget::mousePressEvent(QMouseEvent *e){
    if(e->button != Qt::LeftButton){
        return;
    }
    QListWidget::mousePressEvent(e); //send signal
    start = e->pos();
    //isDrop = false;
}
void myListWidget::mouseMoveEvent(QMouseEvent *e){
    //鼠标左键。
    if(e->buttons & Qt::LeftButton){
        //判断拖动长度大于起始长度,才认为是拖动;否则,不做拖动。
        int distance = (e->pos() - start).manhattanLength();
        if(distance >= QApplication::startDragDistance()) {
            //获取当前被选中的值
            currentItem = this->currentItem();
            if(currentItem){
                // 获取文本,准备要传送的数据
                QMimeData *mimeData = new QMimeData();
                mimeData->setText(currentItem->text());
                //1.准备传送的对象
                QDrag *drag = new QDrag(this);
                drag->setMimeData(mimeData);    
                //1.1设置drag对象的图标
                drag->setPixmap(QPixmap(":/image/add.png"));
                //1.2进行拖动操作
                if(Qt:::MoveAction == drag->exec(Qt:::MoveAction))
                {
                    delete currentItem; //删除原来的值,
                }   
                QListWidget::mouseMoveEvent(e); //发送信号
            }
        }
    }
}


void myListWidget::dragEnterEvent(QDragEnterEvent *e){
    QListWidget *source = qobject_cast<QListWidget*> (e->source());
    if(source != NULL && source!=this){ //只能A到B移动
        e->setDropActiion(Qt::MoveAction);
        e->accept();
    }   
}
void myListWidget::dragMoveEvent(QDragMoveEvent *e){
    QListWidget *source = qobject_cast<QListWidget*> (e->source());
    if(source != NULL && source!=this){
        e->setDropActiion(Qt::MoveAction);
        e->accept();
    }   
}
void myListWidget::dropEvent(QDropEvent *e){
    QListWidget *source = qobject_cast<QListWidget*> (e->source());
    //判断是否为空,判断是否为自己本身。
    if(source != NULL && source!=this){
        QString str = e->mimeData()->text();
        QListWidgetItem *item = new QListWidgetItem(str);
        this->addItem(item);
        this->setCurrentItem(item);
        e->setDropActiion(Qt::MoveAction);
        e->accept();
        isDrop = true;
    }
}
void myListWidget::mouseReleaseEvent(QMouseEvent *e){
    if(!isDrop){
        QListWidgetItem *item = new QListWidgetItem(str);
        this->addItem(item);
        this->setCurrentItem(item);
    } 
}


//dialog.h

#include "mylistwidget.h"
void InitMyListWidget();

private:
    myListWidget * myListA;
    myListWidget * myListB;

//dialog.cpp

void Dialog::InitMyListWidget(){
    myListA = new myListWidget(this);
    myListB = new myListWidget(this);

    QStringList fruit;
    fruit << "Apple" << "Bananan" << "Tomato" <<"Bear" << "Orange" << "WaterMalen";
    myListA.addItems(fruit);    
    
    QStringList game;
    game << "篮球"<< "足球"<< "排球"<< "棒球"<< "橄榄球";
    myListB.addItems(game);
    
    ui->gridLayout->addWidget(myListA);
    ui->gridLayout2->addWidget(myListB);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一个笨方法,年入200万 刚才跟一个合伙人深聊了一下,他做的是线上相亲业务,5个人的团队,一个月能做到20万 项目...
    胡诌文学阅读 90评论 0 1
  • 《人生只有一件事》及其续集《人生总会有答案》是金惟纯先生的作品。金惟纯先生是台湾极具影响力的商业财经杂志《商业周刊...
    青兰522阅读 77评论 0 0
  • 在当今快速发展的软件开发领域,前端开发扮演着至关重要的角色。用户与应用程序的每一次互动都依赖于前端的稳定性和用户体...
    1HELIANYING阅读 48评论 0 0
  • 身边正好有这样的例子。看了这篇文章后,深有同感。mp.weixin.qq.com/s/McIyK3iAwxApgV...
    思求彼得赵阅读 141评论 0 0
  • 学习万以内数的近似数,教材中没有给出固定的求近似数的方法, 也没有用约等号“≈” 去表示近似的结果, 所以四舍五入...
    李小岩lxy阅读 37评论 0 0

友情链接更多精彩内容