关于DB存储过程剖析与设计的一些感受

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Prototype___/article/details/81529694

关系型数据库管理系统最重要的一个目标就是:确保表或者索引中的数据是随时可以用的。那么为了尽可能的实现这个目标,会使用内存中的缓冲池来最小化磁盘活动。通过具体的项目了解关于DB存储过程剖析与设计,以项目驱动,提升理解数据的读取和存储方式。

一、音乐播放器设计

(1) 外观:图片和图标
(2) 最小化->实现窗体的最小化
(3) 关闭->托盘->菜单->播放音乐或者是直接程序的功能
(4) 播放文件->利用ApI处理相关播放的功能
(5) 菜单的功能->样式(qss)

二、功能实现

  1. 托盘菜单->播放音乐->利用API处理相关播放的功能
  2. 列表栏菜单->文件操作1
  3. 播放列表菜单(1.播放音乐2.文件操作3.视图模型操作)

三、文件梳理

MusicPlayer目录下有如下文件:

  • insert
  • pic
  • Alan.mp3
  • bycwtoolbox.cpp
  • bycwtoolboxh
  • DJ. mp3
  • main. cpp
  • musicplayer. cpp
  • musicplayer. h
  • Musicplaver, pro
  • Musicplaver.pro user
  • musicplayer ui
  • Mystyte qss
  • Source.qrc

musicplayer.cpp

#include "musicplayer.h"
#include "ui_musicplayer.h"
#include "bycwtoolbox.h"
#include <QPainter>
#include <QPushButton>
#include <QMediaPlaylist>
#include <QListView>
#include <QStandardItemModel>
#include <QFile>
#include <QScrollBar>
#include <QDebug>
#include <QFileDialog>
#include <QFileInfo>

MusicPlayer::MusicPlayer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MusicPlayer)
{
    urllist.clear();

    mMoveing = false;

    setWindowIcon(QIcon(":/img/pic/ico.png"));
    QPixmap pix(":/img/pic/main.png");
    this->setMaximumSize(QSize(pix.width(), pix.height()));
    this->setMinimumSize(QSize(pix.width(), pix.height()));
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint /*| Qt::WindowStaysOnTopHint*/);
    //设置背景图片
    this->setAutoFillBackground(true); // 这句要加上, 否则可能显示不出背景图.
    QPalette palette = this->palette();
    palette.setBrush(QPalette::Window, QBrush(pix));
    this->setPalette(palette);                           // 给widget加上背景图
    ui->setupUi(this);
   // setWindowFlags(Qt::FramelessWindowHint);

    minbtn = new QPushButton(this);//最小化按钮
    minbtn->move(width()-60,0);
    minbtn->setFixedSize(30,51);
    minbtn->setFlat(true);//窗口透明不显示边框
    minbtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/min.png);}"
            "QPushButton:hover{background-image: url(:/img/pic/min_hove.png);}");
    //最小化到托盘
    connect(minbtn, &QPushButton::clicked, this, [=]()
    {
        this->showMinimized();
    });

    closebtn = new QPushButton(this);//关闭按钮
    closebtn->move(width()-30,0);
    closebtn->setFixedSize(30,51);
    closebtn->setFlat(true);//窗口透明不显示边框
    closebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/close.png);}"
            "QPushButton:hover{background-image: url(:/img/pic/close_hove.png);}");
    connect(closebtn,&QPushButton::clicked,this,[=]()
    {
        //隐藏程序主窗口
        this->hide();

        //新建QSystemTrayIcon对象
        mSysTrayIcon = new QSystemTrayIcon(this);
        //新建托盘要显示的icon
        QIcon icon = QIcon(":/img/pic/ico.png");
        //将icon设到QSystemTrayIcon对象中
        mSysTrayIcon->setIcon(icon);
        //当鼠标移动到托盘上的图标时,会显示此处设置的内容
        mSysTrayIcon->setToolTip("Music Player");

        connect(mSysTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
        //在系统托盘显示此对象
        mSysTrayIcon->show();
    });

    player = new QMediaPlayer(this);
    connect(player, &QMediaPlayer::positionChanged,
        this, &MusicPlayer::updatePosition);

    playlist = new QMediaPlaylist;
    playlist->setCurrentIndex(1);
    playlist->setPlaybackMode(QMediaPlaylist::Random);
    player->setPlaylist(playlist);

    horizontalSlider = new QSlider(this);
    horizontalSlider->setOrientation(Qt::Horizontal);
    horizontalSlider->setFixedWidth(290);
    horizontalSlider->move(10,580);
    connect(horizontalSlider,&QSlider::sliderMoved,this,[=](int position)
    {
        // 设置播放进度
         player->setPosition(position * 1000);
    });

    PreviousMusic = new QPushButton(this);//播放前一首
    PreviousMusic->setFixedSize(37,37);
    PreviousMusic->move(10,603);
    PreviousMusic->setFlat(true);
    PreviousMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/Previous.png);}");
    connect(PreviousMusic,&QPushButton::clicked,this,[=]()
    {
        playlist->previous();

    });

    isPlay = false;
    playorpauseMusic = new QPushButton(this);//播放/暂停
    playorpauseMusic->setFixedSize(47,47);
    playorpauseMusic->move(50,597);
    playorpauseMusic->setFlat(true);
    playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/play.png);}");
    connect(playorpauseMusic,&QPushButton::clicked,this,[=]()
    {
        isPlay = !isPlay;
        if(isPlay){
            player->play();
            playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/pause.png);}");
        }else{
            player->pause();
            playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/play.png);}");
        }

    });

    nextMusic = new QPushButton(this);//播放下一曲
    nextMusic->setFixedSize(37,37);
    nextMusic->move(100,603);
    nextMusic->setFlat(true);
    nextMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/next.png);}");
    connect(nextMusic,&QPushButton::clicked,this,[=]()
    {
       playlist->next();
    });

    slider_volume = new QSlider(this) ;//音量控制
    slider_volume->setOrientation(Qt::Horizontal);
    slider_volume->move(195,612);
    slider_volume->setValue(player->volume());
    //由于不涉及到slider值的刷新,因此只需对move和自定义click两个信号进行处理,并且可以共用一个槽函数
    connect(slider_volume,&QSlider::sliderPressed,this,&MusicPlayer::slider_volume_changed);
    connect(slider_volume,&QSlider::sliderMoved,this,&MusicPlayer::slider_volume_changed);

    vlluemeNum = 0;
    state_slider_volume = false;
    volumebtn = new QPushButton(this);//音量控制
    volumebtn->setFixedSize(20,21);
    volumebtn->move(170,613);
    volumebtn->setFlat(true);
    volumebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/volume.png);}");
    connect(volumebtn,&QPushButton::clicked,this,[=]()
    {
       state_slider_volume = !state_slider_volume;
       if(state_slider_volume){
           volumebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/volume_close.png);}");
           vlluemeNum = slider_volume->value();
           slider_volume->setValue(0);
       }else{
           volumebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/volume.png);}");
           slider_volume->setValue(vlluemeNum);
       }
       player->setVolume(slider_volume->value());
    });

    toolbox = new BYCWToolBox(this);
    toolbox->setFixedSize(350,450);

    listview = new QListView(toolbox);//模型表
    listview->setFixedSize(312,416);
    listview->setEditTriggers(QAbstractItemView::NoEditTriggers);
    listview->move(20,95);
    connect(listview,&QListView::doubleClicked,this,&MusicPlayer::on_listView_doubleClicked);
    listview->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(listview, &QListView::customContextMenuRequested,this, [=](const QPoint& point){
        QMenu *cmenu = new QMenu(listview);

        QAction *AddMusic = cmenu->addAction("添加歌曲");
        if(urllist.count()){

            QAction *playMusic = cmenu->addAction("播放歌曲");
            connect(playMusic, &QAction::triggered, this, [=]()
            {
                playlist->setCurrentIndex(listview->currentIndex().row());
                player->play();
                playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/pause.png);}");
            });

            QAction *delMusic = cmenu->addAction("删除歌曲");
            connect(delMusic, &QAction::triggered, this, [=]()
            {
                int row = listview->currentIndex().row();
                playlist->removeMedia(row);
                model->removeRow(row);
                urllist.removeAt(row);
                listview->setUpdatesEnabled(true);
            });
        }

        connect(AddMusic, &QAction::triggered, this, &MusicPlayer::openFile);
        cmenu->exec(QCursor::pos());//在当前鼠标位置显示
       delete cmenu;
    });

    model = new QStandardItemModel(this);//数据模型
    listview->setModel(model);


    IsTermExpansion = true;
    toolbox->addItem(listview,QIcon(":/img/pic/itemup.png"),"默认播放列表");
    toolbox->move(0,95);
    connect(toolbox,&BYCWToolBox::sendchangeIcon,this,&MusicPlayer::toolbox_Item_currentChanged);
    connect(toolbox,&BYCWToolBox::sendindexOpenDir,this,&MusicPlayer::openDir);
    connect(toolbox,&BYCWToolBox::sendindexOpenFile,this,&MusicPlayer::openFile);

    QString qss;
    QFile qssFile(":/qss/MyStyte.qss");
    qssFile.open(QFile::ReadOnly);
    if(qssFile.isOpen())
    {
        qss = QLatin1String(qssFile.readAll());
        setStyleSheet(qss);
        qssFile.close();
    }
}

MusicPlayer::~MusicPlayer()
{
    delete ui;
}

void MusicPlayer::mousePressEvent(QMouseEvent *event)
{
    mMoveing = true;
    //记录下鼠标相对于窗口的位置
    //event->globalPos()鼠标按下时,鼠标相对于整个屏幕位置
    //pos() this->pos()鼠标按下时,窗口相对于整个屏幕位置
    mMovePosition = event->globalPos() - pos();
    return QWidget::mousePressEvent(event);
}

void MusicPlayer::mouseMoveEvent(QMouseEvent *event)
{
    //(event->buttons() && Qt::LeftButton)按下是左键
    //鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标?
    //通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标
    if (mMoveing && (event->buttons() && Qt::LeftButton)
        && (event->globalPos() - mMovePosition).manhattanLength() > QApplication::startDragDistance())
    {
        move(event->globalPos() - mMovePosition);
        mMovePosition = event->globalPos() - pos();
    }
    return QWidget::mouseMoveEvent(event);
}

void MusicPlayer::mouseReleaseEvent(QMouseEvent *event)
{
    mMoveing = false;
    return QWidget::mouseReleaseEvent(event);
}

//重绘函数
void MusicPlayer::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/img/pic/ico.png");
    painter.drawPixmap(5,-5,40,40,pix);

    pix.load(":/img/pic/musicico.png");
    painter.drawPixmap(15,55,30,30,pix);

    QFont font;
    font.setPixelSize(25);
    font.setBold(true);
    painter.setFont(font);

    QPen pen;
    pen.setColor(Qt::black);
    painter.setPen(pen);

    painter.drawText(QPoint(42,38),"MusicPlayer");

}

//音量控制
void MusicPlayer::slider_volume_changed()
{
//    if (slider_volume->value() == 0)
//      volumebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/volume_close.png);}");
//  else
//      volumebtn->setStyleSheet("QPushButton{background-image: url(:/img/pic/volume.png);}");

    player->setVolume(slider_volume->value());
}

void MusicPlayer::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason){
    case QSystemTrayIcon::Trigger:
        //单击托盘图标
        break;
    case QSystemTrayIcon::DoubleClick:
        //双击托盘图标
        //双击后显示主程序窗口
        mSysTrayIcon->hide();
        this->show();
        break;
    case QSystemTrayIcon::Context:
        addSysTrayMenu();
        break;
    default:
        break;
    }
}
//添加托盘菜单
void MusicPlayer::addSysTrayMenu()
{
    QMenu *menu = new QMenu(this);
    QAction *showwindow = new QAction("显示界面",this);
    connect(showwindow,&QAction::triggered,this,[=]()
    {
        mSysTrayIcon->hide();
        this->show();
    });
    QAction *out = new QAction("OUT",this);
    connect(out,&QAction::triggered,this,&MusicPlayer::close);

    menu->addAction(showwindow);
    menu->addAction(out);
    menu->exec(QCursor::pos());
    delete menu;
}

void MusicPlayer::updatePosition(qint64 position)
{ // 更新滑块显示
    horizontalSlider->setMaximum(player->duration() / 1000);
    horizontalSlider->setValue(position / 1000);
}

void MusicPlayer::openFile()
{
    QFileInfo fi;
    QString filename = QFileDialog::getOpenFileName(
                this,
                "open Music",
                QDir::currentPath(),
                "music files(*.mp3);;All files(*.*)");
    if(filename.isEmpty())
        return;

    bool falg = false;
    int i =0;
    if(urllist.count()){
        foreach(QString strurl,urllist)
        {
            i++;
            if( strurl == filename){
                falg = true;
                break;
            }
        }
    }
    if(!falg){
       playlist->addMedia(QUrl::fromLocalFile(filename));
       urllist.append(filename);
       fi = QFileInfo(filename);
       QString str = fi.fileName();//获取文件名
       int index;
       index = str.lastIndexOf(".");  //一般来说,扩展名为最后一个“.”之后的字符;
       str.truncate(index);//把它cate掉
       QStandardItem *item = new QStandardItem(str);
       model->appendRow(item);
       listview->setUpdatesEnabled(true);
       playlist->setCurrentIndex(model->rowCount()-1);
    }else{
        playlist->setCurrentIndex(i-1);
    }
    player->play();
    playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/pause.png);}");
}
void MusicPlayer::openDir()
{
    QString dirname = QFileDialog::getExistingDirectory(this,tr("open Directiry"),".");
    if(dirname.isEmpty())
        return;

    QDir dir(dirname);
    dir.setNameFilters(QStringList("*.mp3"));
    QStringList strListFileName = dir.entryList();//获取文件名列表
    QString strPathName = dir.absolutePath();//获取目录路径
    int count = strListFileName.count();//文件个数

    for(int i =0;i<count;i++)
    {
        bool falg = false;
        if(urllist.count()){
            foreach(QString strurl,urllist)
            {
                QString path = strPathName+"/"+strListFileName.at(i);
                if( strurl == path){
                    falg = true;
                    break;
                }
            }
        }
        if(!falg){
            urllist.append(strPathName+"/"+strListFileName.at(i));
            playlist->addMedia(QUrl::fromLocalFile(strPathName+"/"+strListFileName.at(i)));
            QString str = strListFileName.at(i);
            int index;
            index = str.lastIndexOf(".");  //一般来说,扩展名为最后一个“.”之后的字符;
            str.truncate(index);//把它cate掉
            QStandardItem *item = new QStandardItem(str);
            model->appendRow(item);
        }
    }
    listview->setUpdatesEnabled(true);
}

//双击播放链表
void MusicPlayer::on_listView_doubleClicked(QModelIndex index)
{
    playlist->setCurrentIndex(index.row());
    player->play();
    playorpauseMusic->setStyleSheet("QPushButton{background-image: url(:/img/pic/pause.png);}");
}

//ToolBox切换
void MusicPlayer::toolbox_Item_currentChanged(int index)
{
    IsTermExpansion = !IsTermExpansion;
    if(IsTermExpansion){
        toolbox->setItemIcon(index, QIcon(":/img/pic/item_down.png"));
        listview->hide();
    }else{
        toolbox->setItemIcon(index, QIcon(":/img/pic/itemup.png"));
        listview->show();
    }
}

//setItemIcon(int index, const QIcon &icon)
/*
 * 托盘菜单
 *
void MainWindow::createSystemTrayIcon()
{
    trayIcon=new QSystemTrayIcon(this);//创建托盘
    trayIcon->setIcon(QIcon(tr(":images/icon")));//设置托盘图标
    trayIcon->setToolTip(tr("托盘"));

    play_widget = new QWidget();
    play_widget_Action = new QWidgetAction(this);

    //创建所需的按钮和动作并连接信号槽
    play_Button = new QPushButton();
    play_Button ->setCursor(Qt::PointingHandCursor);
    play_Button ->setFlat(true);
    play_Button->setFixedSize(40,40);
    connect(play_Button,SIGNAL(clicked()), this, SLOT(Play()));

    last_Button = new QPushButton();
    last_Button ->setCursor(Qt::PointingHandCursor);
    last_Button ->setFlat(true);
    last_Button->setFixedSize(30,30);
    connect(last_Button, SIGNAL(clicked()), this, SLOT(Last()));

    next_Button = new QPushButton();
    next_Button->setCursor(Qt::PointingHandCursor);
    next_Button ->setFlat(true);
    next_Button->setFixedSize(30,30);
    connect(next_Button, SIGNAL(clicked()), this, SLOT(Next()));

    musicname_Label = new QLabel();
    musicname_Label->setFixedWidth(100);
    musicname_Label->setAlignment(Qt::AlignCenter);

    aboutAction = new QAction(tr("关  于"),this);
    aboutAction->setIcon(QIcon(":/images/about"));
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(about()));

    quitAction=new QAction(tr("退  出"), this);
    quitAction->setIcon(QIcon(":/images/quit"));
    connect(quitAction, SIGNAL(triggered()), this, SLOT(quit()));

//使用样式表修饰按钮
    last_Button->setStyleSheet("QPushButton {border-image:url(:/images/last);}QPushButton:hover{border-image:url(:/images/last_on);}QPushButton:hover:pressed{border-image:url(:/images/last);}");
    play_Button->setStyleSheet("QPushButton {border-image:url(:/images/play);}QPushButton:hover{border-image:url(:/images/play_on);}QPushButton:hover:pressed{border-image:url(:/images/play);}");
    next_Button->setStyleSheet("QPushButton {border-image:url(:/images/next);}QPushButton:hover{border-image:url(:/images/next_on);}QPushButton:hover:pressed{border-image:url(:/images/next);}");

//将next,last和play按钮水平布局
    QHBoxLayout *Hlayout = new QHBoxLayout();
    Hlayout->addWidget(last_Button);
    Hlayout->addWidget(play_Button);
    Hlayout->addWidget(next_Button);
    Hlayout->setSpacing(0);
    Hlayout->setContentsMargins(20, 0, 20, 0);

//将上面布好的一排按钮和歌名Label垂直布局
    QVBoxLayout *Vlayout = new QVBoxLayout();
    Vlayout->addLayout(Hlayout);
    Vlayout->addWidget(musicname_Label,0,Qt::AlignCenter);
    Vlayout->setSpacing(5);
    Vlayout->setContentsMargins(0, 0, 0, 5);
    musicname_Label->setEnabled(false);

//将上面整合好的控件作为一个widget并将此widget赋给一个Action
    play_widget->setLayout(Vlayout);
    play_widget_Action->setDefaultWidget(play_widget);

//new一个托盘菜单并将上面的Action和其他Action赋给托盘菜单
    trayContextMenu=new QMenu(this);
    trayContextMenu->addAction(play_widget_Action);
    trayContextMenu->addSeparator();
    trayContextMenu->addAction(aboutAction);
    trayContextMenu->addAction(quitAction);

//将托盘菜单赋给托盘并显示托盘
    trayIcon->setContextMenu(trayContextMenu);
    trayIcon->show();

//点击托盘执行的事件
    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
    this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
}


*/

main.cpp

#include "musicplayer.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MusicPlayer w;
    w.show();

    return a.exec();
}

musicplayer.h

#ifndef MUSICPLAYER_H
#define MUSICPLAYER_H

#include <QWidget>
#include <QMouseEvent>
#include <QSystemTrayIcon>
#include <QMediaPlayer>
#include <QSlider>
#include <QModelIndex>

class QMediaPlaylist;
class QLabel;
class QPushButton;
class QListView;
class QStandardItemModel;
class BYCWToolBox;

namespace Ui {
class MusicPlayer;
}

class MusicPlayer : public QWidget
{
    Q_OBJECT

public:
    explicit MusicPlayer(QWidget *parent = 0);
    ~MusicPlayer();

private slots:
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);//托盘
    void updatePosition(qint64 position);//更新滑块
    void toolbox_Item_currentChanged(int);//ToolBox切换

    void openFile();//打开文件
    void openDir();//打开目录

    void on_listView_doubleClicked(QModelIndex index);//双击播放链表
    void slider_volume_changed();//音量控制

protected:
    void mousePressEvent(QMouseEvent *event);//鼠标按下
    void mouseMoveEvent(QMouseEvent *event);//鼠标拖动
    void mouseReleaseEvent(QMouseEvent *event);//鼠标弹起

    void paintEvent(QPaintEvent *event);//重绘函数
private:
    void addSysTrayMenu();//添加托盘菜单
private:
    Ui::MusicPlayer *ui;

    QPushButton *minbtn;//最小化按钮
    QPushButton *closebtn;//关闭按钮

    QPushButton *PreviousMusic;//前一首
    QPushButton *playorpauseMusic;//播放/暂停
    QPushButton *nextMusic;//后一首
    QPushButton *volumebtn;//音量控制
    bool isPlay;//是否在播放
    bool state_slider_volume;//是否点击音量控制
    int vlluemeNum;//音量记录

    bool IsTermExpansion;//项是否展开

    //拖动控制成员变量
    bool mMoveing;//是否点击按下鼠标
    QPoint mMovePosition;//鼠标按下位置

    QSystemTrayIcon *mSysTrayIcon;//托盘

    QMediaPlayer *player;//音乐播放
    QMediaPlaylist *playlist;//播放列表

    QSlider *horizontalSlider;//播放线条
    QSlider *slider_volume ;//音量控制

    QStandardItemModel *model;//list数据模型
    QListView *listview;//模型表

    BYCWToolBox *toolbox;//工具条

    QStringList urllist;//路径链表
};

#endif // MUSICPLAYER_H

bycwtoolbox.cpp

#include "bycwtoolbox.h"
#include <QAbstractButton>
#include <QDebug>
#include <QMenu>

BYCWToolBox::BYCWToolBox(QWidget *parent):
    QToolBox(parent)
{

}

int BYCWToolBox::GetContextIndex(QString title)
{
    int index = -1;
    int num = count();
    for(int i = 0; i < num; i++)
    {
        QString s = itemText(i);
        if(title == s)
        {
            index = i;
            break;
        }
    }
    return index;
}

void BYCWToolBox::contextMenuEvent(QContextMenuEvent *e)
{
    QList<QAbstractButton *> btnlist = findChildren<QAbstractButton*>();
    QAbstractButton* btn = NULL;
    qint32 counter = btnlist.count();
    for (qint32 i = 0; i < counter; i++)
    {
        btn = btnlist.at(i);
        btn->installEventFilter(this); // method 1.
        int index = GetContextIndex(btn->text());
        if(-1 == index)
        {
            break;
        }
        qDebug()<<index;
        connect(btn, &QAbstractButton::clicked, this, [=]()
        {
            emit sendchangeIcon(index);
        });
    }

    do
    {
        QWidget *pWidget = childAt(e->x(), e->y());
        if(nullptr == pWidget)
        {
            break;
        }

        QAbstractButton *pBt = dynamic_cast<QAbstractButton*>(pWidget);
        if(nullptr == pBt)
        {
            break;
        }

        int index = GetContextIndex(pBt->text());
        if(-1 == index)
        {
            break;
        }
        //通过index进行相应的菜单显示及操作
        AddCreateMenu();

    }while(false);



}

//新增右键菜单
void BYCWToolBox::AddCreateMenu()
{
    QMenu *menu = new QMenu(this);
    QAction *openfile = new QAction("打开文件",this);
    connect(openfile,&QAction::triggered,this,[=]()
    {
        emit sendindexOpenFile();
    });

    QAction *openDir = new QAction("打开目录",this);
    connect(openDir,&QAction::triggered,this,[=]()
    {
        emit sendindexOpenDir();
    });

    menu->addAction(openfile);
    menu->addAction(openDir);
//    if(index != 0){
//        QAction *del = new QAction("删除该项",this);
//        connect(del,&QAction::triggered,this,[=]()
//        {
//            emit sendindexDel(index);
//        });
//         menu->addAction(del);
//    }else{
//        QAction *add = new QAction("增加选项",this);
//        connect(add,&QAction::triggered,this,[=]()
//        {
//            emit sendindexAdd();
//        });
//         menu->addAction(add);
//    }
    menu->exec(QCursor::pos());
    delete menu;
}

bycwtoolbox.h

#ifndef BYCWTOOLBOX_H
#define BYCWTOOLBOX_H

#include <QWidget>
#include <QToolBox>
#include <QContextMenuEvent>

class BYCWToolBox : public QToolBox
{
    Q_OBJECT
public:
    explicit BYCWToolBox(QWidget *parent);
private:
    int GetContextIndex(QString title);//获取点击的显示
    void AddCreateMenu();//新增右键菜单
signals:
    void sendindexOpenDir();//发送对应的Item打开目录
    void sendindexOpenFile();//发送对应的Item打开文件
//    void sendindexDel(const int& index);//发送对应的Item删除
//    void sendindexAdd();//发送增加项

    void sendchangeIcon(int);//发送图标修改并改变项的显示
protected:
    void contextMenuEvent(QContextMenuEvent *e);
};

#endif // BYCWTOOLBOX_H

musicplayer.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MusicPlayer</class>
 <widget class="QWidget" name="MusicPlayer">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>544</width>
    <height>436</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MusicPlayer</string>
  </property>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

MyStyte.qss

QListView {
    color: rgb(127, 0, 63);
    background-color: rgb(255, 255, 241);
    selection-color: white;
    border: 2px groove gray;border-radius: 10px;
    padding: 5px 4px;
}

QSlider::groove:horizontal {
    border: 1px solid #4A708B;
    background: #C0C0C0;
    height: 5px;
    border-radius: 1px;
    padding-left:-1px;
    padding-right:-1px;
}

QSlider::sub-page:horizontal {
    background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
    stop:0 #B1B1B1, stop:1 #c4c4c4);
    background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
    stop: 0 #5DCCFF, stop: 1 #1874CD);
    border: 1px solid #4A708B;
    height: 10px;
    border-radius: 2px;
}

QSlider::add-page:horizontal {
    background: #575757;
    border: 0px solid #777;
    height: 10px;
    border-radius: 2px;
}

QSlider::handle:horizontal
{
    background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5,
    stop:0.6 #45ADED, stop:0.778409 rgba(255, 255, 255, 255));

    width: 11px;
    margin-top: -3px;
    margin-bottom: -3px;
    border-radius: 5px;
}

QSlider::handle:horizontal:hover {
    background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0.6 #2A8BDA,
    stop:0.778409 rgba(255, 255, 255, 255));

    width: 11px;
    margin-top: -3px;
    margin-bottom: -3px;
    border-radius: 5px;
}

QSlider::sub-page:horizontal:disabled {
background: #00009C;
border-color: #999;
}

QSlider::add-page:horizontal:disabled {
background: #eee;
border-color: #999;
}

QSlider::handle:horizontal:disabled {
background: #eee;
border: 1px solid #aaa;
border-radius: 4px;
}


QMenu {
        background-color:rgb(89,87,87);
        border: 1px solid rgb(235,110,36);
}
QMenu::item {
        font-size: 8pt;
        color: rgb(225,225,225);
        border: 1px solid rgb(60,60,60);
        background-color:rgb(89,87,87);
        padding:2px 2px;
        margin:1px 1px;
}
QMenu::item:selected {
        background-color:rgb(235,110,36);
}
QMenu::item:pressed {
        border: 1px solid rgb(60,60,61);
        background-color: rgb(220,80,6);
}

QToolBox::tab {
         background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                     stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
                                     stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
         border-radius: 5px;
         color: darkgray;
}

QToolBox::tab:selected { /* italicize selected tabs */
         font: italic;
         color: blue;
}

QScrollBar:vertical
{
    width:15px;
    background:rgba(0,0,0,0);
    padding-bottom:9px;
    background-position: right;
}
QScrollBar::handle:vertical
{
    width:15px;
    border-image:url(:/ClassBlackBoard/Resources/ClassBlackBoard/Slider.png);
}
QScrollBar::add-line:vertical
{
    height:0px;width:0px;
    subcontrol-position:bottom;
}
QScrollBar::sub-line:vertical
{
    height:0px;width:0px;
    subcontrol-position:top;
}

QScrollBar:horizontal
{
    width:15px;
    background:rgba(0,0,0,0);
    padding-bottom:9px;
    background-position: right;
}
QScrollBar::handle:horizontal
{
    width:15px;
    border-image:url(:/ClassBlackBoard/Resources/ClassBlackBoard/Slider.png);
}
QScrollBar::add-line:horizontal
{
    height:0px;width:0px;
    subcontrol-position:bottom;
}
QScrollBar::sub-line:horizontal
{
    height:0px;width:0px;
    subcontrol-position:top;
}

四、总结

按照规范设计,将数据库的设计过程分为六个阶段:
①系统需求分析阶段
②概念结构设计阶段
③逻辑结构设计阶段
④物理结构设计阶段
⑤数据库实施阶段
⑥数据库运行与维护阶段

1.需求分析的任务
需求分析的任务:对现实世界要处理的对象进行详细的调查,通过对原系统的了解,收集支持新系统的基础数据并对其进行处理,在此基础上确定新系统的功能。
①调查分析用户活动
②收集和分析需求数据,确定系统边界信息需求,处理需求,安全性和完整性需求
③编写系统分析报告

2.需求分析的方法
需求分析有两种方法:自顶向下、自底向上
①自顶向下
自顶向下方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统。
用数据流图和数据字典描述系统
数据流图:描述输入数据到输出数据的变换过程
数据流:由一组固定成分的数据组成,代表数据的流动方向
处理:描述了输入数据到输出数据的变换
文件:用于存储数据
源或宿:存在于系统之外的人员或组织,表示系统输入数据的来源和输出数据的去向
②自底向上

音乐播放器的基本需求:
音乐播放器,音乐实体包括序号、歌手姓名、专辑、版本、发布日期,每首音乐选择一个专辑,专辑包括专辑编号、名称、类别,一个专辑属于一个歌手,一个歌手可以有多个专辑。专辑信息要存储专辑号、歌曲名。音乐管理要管理歌曲表、专辑表。

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/81529694