关系型数据库管理系统最重要的一个目标就是:确保表或者索引中的数据是随时可以用的。那么为了尽可能的实现这个目标,会使用内存中的缓冲池来最小化磁盘活动。通过具体的项目了解关于DB存储过程剖析与设计,以项目驱动,提升理解数据的读取和存储方式。
一、音乐播放器设计
(1) 外观:图片和图标
(2) 最小化->实现窗体的最小化
(3) 关闭->托盘->菜单->播放音乐或者是直接程序的功能
(4) 播放文件->利用ApI处理相关播放的功能
(5) 菜单的功能->样式(qss)
二、功能实现
- 托盘菜单->播放音乐->利用API处理相关播放的功能
- 列表栏菜单->文件操作1
- 播放列表菜单(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.需求分析的方法
需求分析有两种方法:自顶向下、自底向上
①自顶向下
自顶向下方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统。
用数据流图和数据字典描述系统
数据流图:描述输入数据到输出数据的变换过程
数据流:由一组固定成分的数据组成,代表数据的流动方向
处理:描述了输入数据到输出数据的变换
文件:用于存储数据
源或宿:存在于系统之外的人员或组织,表示系统输入数据的来源和输出数据的去向
②自底向上
音乐播放器的基本需求:
音乐播放器,音乐实体包括序号、歌手姓名、专辑、版本、发布日期,每首音乐选择一个专辑,专辑包括专辑编号、名称、类别,一个专辑属于一个歌手,一个歌手可以有多个专辑。专辑信息要存储专辑号、歌曲名。音乐管理要管理歌曲表、专辑表。