欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

qt5之QDialog支持拖放

程序员文章站 2022-03-15 21:07:01
...

QDialog 对象 的窗体 若需要 能 拖放, 需要设置:

1、设置窗体属性

setAcceptDrops(true);

2、重写函数

dragEnterEvent

 void dragEnterEvent(QDragEnterEvent*event);

dropEvent

void dropEvent(QDropEvent*event);

3、示例

我这里  设置为 仅能支持 拖放 *.db 文件, 即 sqlite3数据库文件

关键代码

if(!event->mimeData()->urls()[0].fileName().right(2).compare("db") )

函数源码

// 拖动进入事件
void Dialog::dragEnterEvent(QDragEnterEvent *event)
{
    // 这里,只接受 sqlite3 格式的数据库文件 *。db
    if(!event->mimeData()->urls()[0].fileName().right(2).compare("db") )
    {
        event->acceptProposedAction();
    }
    else
    {
        event->ignore();//否则不接受鼠标事件
    }

}

,注意,下面的函数中 ,虽然很长,但是 函数体开始的地方 有自定义代码开始的标志, 该标志后的代码都是自定义的

void Dialog::dropEvent(QDropEvent *event)
{

    /// 下面为自定义代码
    ///---------------------------------------------------------

    // 1、若配置文件路径变量不为空,则说明已经有数据库文件了
    if (false                   == configFilePath.isEmpty())
    {
        QFileInfo fileInfo(configFilePath);
        bool isExistConfigFile  = fileInfo.isFile();
         // 1.1 若不存在该文件
        if (false               == isExistConfigFile)
        {
#ifdef QT_DEBUG
            qDebug() << "不存在该文件";
#endif  //QT_DEBUG

        }

        // 1.2  存在该文件
        else
        {
            // 若数据库打开,则关闭
            bool isOpen         = sqliteDatabase.isOpen();
            if (true            == isOpen)
            {
                sqliteDatabase.close();
#ifdef QT_DEBUG
                qDebug() << "数据库已经打开,现在已经关闭";
#endif  //QT_DEBUG
            }

            // 将数据库路径设置空
            configFilePath      = QString("");
        }

    }



    // 获取MIMEData
    const QMimeData *qm     = event->mimeData();

    // 得到拖拽的文件路径
    QString dragFilePath   = qm->urls()[0].toLocalFile();

    //-----------------------------------------------------------------

    // 检查dev tab
    // 0、检查外设标签是否添加
    bool isAddDev               = GetAddDevTabFlag();

    // 0.1 添加了
    if (true                    == isAddDev)
    {
        // 外设窗体中文件打开没有关闭
        bool devFileIsOepn      = devDialog->GetFileIsOpen();
        if (true                == devFileIsOepn)
        {
            int okcancel        = QMessageBox::warning(this, tr("tip"), tr("dev file has opended, do U wanna go?"), QMessageBox::Ok | QMessageBox::Cancel);

            // 若选择否
            if  (QMessageBox::Cancel    == okcancel)
            {
                // 选择否,不继续打开新的文件
                return;
            }

            // 选择是,则继续

        }

        // 检查文件是否关闭
        devDialog->CheckFileClose();
    }


    // 尝试打开文件
    PreOpenFile();

    // 3、尝试打开并获取文件内容
    OpenFile(dragFilePath);

}


相关标签: qt5 QDialog拖放