diff --git a/main.cpp b/main.cpp index 1d5c2d7..f429904 100644 --- a/main.cpp +++ b/main.cpp @@ -34,6 +34,9 @@ int main(int argc, char *argv[]) ScreenCapture p; p.EnumScreen(); + SYSTEMTIME st; + GetSystemTime(&st); + Direct3D9TakeScreenshots(0,4); QssEventFilter filter; QApplication app(argc, argv); diff --git a/mainwindow.cpp b/mainwindow.cpp index 693de46..d81bdca 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -38,7 +38,8 @@ MainWindow::MainWindow(QWidget *parent) : qDebug()<<"capture "<::iterator itr = mMic.begin();itr != mMic.end();itr++){ qDebug()<name)<index; - + ui->comboBox_2->addItem(QString::fromWCharArray(itr->name.c_str(),itr->name.size()), + QString::fromWCharArray(itr->name.c_str(),itr->name.size())); } mTimer = new QTimer(this); @@ -57,7 +58,6 @@ void MainWindow::on_pushButton_clicked(){ } if(!m_bCameraOpen){ mPlayerWidget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32); - mPlayerWidget->SetImgSize(640,480); qDebug()<comboBox->currentText().size()<comboBox->currentText(); wchar_t *opencamera = new wchar_t[ui->comboBox->currentText().size()]; @@ -66,6 +66,9 @@ void MainWindow::on_pushButton_clicked(){ if(nullptr == mCamera){ this->mCamera = new Camera(ss); } + GUIDToAvFormat(mCamera->MediaType()); + mPlayerWidget->SetImgSize(mCamera->GetWidth(),mCamera->GetHeight()); + this->mCamera->SetObserver(mPlayerWidget); qDebug()<comboBox->currentText(); ui->pushButton->setText("关闭摄像头"); @@ -104,7 +107,7 @@ void MainWindow::on_pushButton_2_clicked() if (!mPusher->IfConnect()) { const char* address = ui->lineEdit->text().toLocal8Bit().data(); qDebug()<RTMP264_Connect("rtmp://hyrtc.net:2530/live/123")) { + if (0 == mPusher->RTMP264_Connect("rtmp://127.0.0.1:1935/live/1")) { ToastWidget::showTip("已经连接上RTMP服务器",this->parentWidget()); mVideoCoder->SetOberver(mPusher); mPusher->StartPush(); @@ -128,6 +131,12 @@ void MainWindow::on_pushButton_2_clicked() void MainWindow::on_pushButton_3_clicked() { qDebug()<comboBox_2->currentText(); + wchar_t ptr[200]; + + ui->comboBox_2->currentText().toWCharArray(ptr); + + mAudioCapture->InitCapture(ptr,4800,2); + } void MainWindow::DetectDpi() diff --git a/media/CameraCapture.cpp b/media/CameraCapture.cpp index 5737f73..356ab0f 100644 --- a/media/CameraCapture.cpp +++ b/media/CameraCapture.cpp @@ -305,7 +305,6 @@ bool Camera::Open(std::wstring &camera_name) } mediaType.formattype = FORMAT_VideoInfo; hr = mSampGrabber->SetMediaType(&mediaType); - // 意味着最后的数据是丢掉的 CHECK_HR(CoCreateInstance(CLSID_NullRenderer, nullptr, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)(&dest_filter))); mGraphBuilder->AddFilter(dest_filter, L"nullptrRenderer"); @@ -415,6 +414,9 @@ HRESULT STDMETHODCALLTYPE Camera::SampleGrabberCallback::BufferCB(double Time, B fwrite(pBuffer,BufferLen,1,p); fflush(p); #endif + if(0 == pBuffer){ + return -1; + } if (mObserver.size() > 0) { diff --git a/media/RtmpPusher.cpp b/media/RtmpPusher.cpp index 4171b73..72d36d3 100644 --- a/media/RtmpPusher.cpp +++ b/media/RtmpPusher.cpp @@ -1,4 +1,5 @@ #include "RtmpPusher.h" +#include /** * ʼwinsock @@ -126,6 +127,9 @@ int RtmpPusher::SendPacket(unsigned int nPacketType, unsigned char * data, int RtmpPusher::SendVideoPacket(unsigned int nPacketType, unsigned char * data, unsigned int size, unsigned int nTimestamp) { + SYSTEMTIME st; + GetSystemTime(&st); + qDebug()<SendH264Packet(nalhead, size, 0, time - mStartTime); + this->SendH264Packet(nalhead, size, 0, ttt - mStartTime); return 0; } //sps ֡н @@ -244,22 +256,22 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) else { // i frame if ((data[i + 2] == 0x01) && (data[i + 3] == 0x65)) { - time += 100; + time += 60; naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, time - mStartTime); + this->SendH264Packet(nalhead, size, 0, ttt - mStartTime); nalhead = data + i; naltail = data + (len); size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, time - mStartTime); + this->SendH264Packet(nalhead, size, 0, ttt - mStartTime); return 0; } //pps if ((data[i + 3] == 0x01) && (data[i + 4] == 0x68)) { // sps or pps or sei naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, time - mStartTime); + this->SendH264Packet(nalhead, size, 0, ttt - mStartTime); nalhead = data + i; i += 3; }//sps @@ -271,7 +283,7 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) if ((data[i + 3] == 0x01) && (data[i + 4] == 0x06)) { // sps or pps or sei naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, time - mStartTime); + this->SendH264Packet(nalhead, size, 0, ttt - mStartTime); nalhead = data + i; i += 3; } @@ -528,6 +540,7 @@ void H264RtmpPuser::ProcessSend() { while (this->mIfStart) { int len = mPack.size(); + qDebug()<<"unsend size"< #include #include +#include +#include + using namespace std; #define RTMP_HEAD_SIZE (sizeof(RTMPPacket)+RTMP_MAX_HEADER_SIZE) diff --git a/media/VideoCoder.cpp b/media/VideoCoder.cpp index 9c0d759..27c47a6 100644 --- a/media/VideoCoder.cpp +++ b/media/VideoCoder.cpp @@ -20,6 +20,181 @@ int VideoCoder::SetDestPix(uint8_t width, uint8_t height) { return 0; } +/// +/// @brief 垂直翻转RGB数据 +/// @param[in] width - RGB图像宽度 +/// @param[in] height - RGB图像高度 +/// @param[in] rgbData - RGB图像数据指针 +/// @param[in] bitsPerPixel - 每一个像素的字节大小,通常为rgbData的长度/width*height +/// + +int VideoCoder::Filter(int in_width, int in_height, unsigned char* rgbData, int bitsPerPixel) +{ + //1.注册过滤器 + avfilter_register_all(); + + //2.创建一个过滤器图层,管理所有过滤器 + AVFilterGraph* filter_graph = avfilter_graph_alloc(); + if (!filter_graph) { + printf("Fail to create filter graph!\n"); + return -1; + } + + //3.获取一个用于AVFilterGraph输入的过滤器 + // source filter,源头过滤器,过滤器参数 一般为图像格式信息 + char args[512]; + sprintf(args, + "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", + in_width, in_height, AV_PIX_FMT_YUV420P, 1, 25, 1, 1); + //bufferSrc->description = Buffer video frames, and make them accessible to the filterchain. + const AVFilter* bufferSrc = avfilter_get_by_name("buffer"); // AVFilterGraph的输入源 + + AVFilterContext* bufferSrc_ctx; + int ret = avfilter_graph_create_filter(&bufferSrc_ctx, bufferSrc, "in", args, NULL, filter_graph); + if (ret < 0) { + printf("Fail to create filter bufferSrc\n"); + return -1; + } + + //4.获取一个用于AVFilterGraph输出的过滤器 + // sink filter, + AVBufferSinkParams *bufferSink_params; + AVFilterContext* bufferSink_ctx; + const AVFilter* bufferSink = avfilter_get_by_name("buffersink"); + enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }; + + bufferSink_params = av_buffersink_params_alloc(); + bufferSink_params->pixel_fmts = pix_fmts; + ret = avfilter_graph_create_filter(&bufferSink_ctx, bufferSink, "out", NULL, + bufferSink_params, filter_graph); + if (ret < 0) { + printf("Fail to create filter sink filter\n"); + return -1; + } + + //5. split filter:用于分流,outputs=2表示输出两股流 + const AVFilter *splitFilter = avfilter_get_by_name("split"); + AVFilterContext *splitFilter_ctx; + ret = avfilter_graph_create_filter(&splitFilter_ctx, splitFilter, "split", "outputs=2", + NULL, filter_graph); + if (ret < 0) { + printf("Fail to create split filter\n"); + return -1; + } + + //6. crop filter:裁剪,out_w=iw:out_h=ih/2:x=0:y=0表示裁剪得到的区域 + const AVFilter *cropFilter = avfilter_get_by_name("crop"); + AVFilterContext *cropFilter_ctx; + ret = avfilter_graph_create_filter(&cropFilter_ctx, cropFilter, "crop", + "out_w=iw:out_h=ih/2:x=0:y=0", NULL, filter_graph); + if (ret < 0) { + printf("Fail to create crop filter\n"); + return -1; + } + + //7. vflip filter:垂直翻转,从上到下?==》最终合成的位置由overlay过滤器设置,经确认是将裁剪的区域翻转后拼接到图像下半部分, + //图像上半部分不变(不变是因为split分割出了两路流,过滤器是操作的辅助流) + //配合使用crop:out_w=iw:out_h=ih/2:x=0:y=ih/2进行验证 + const AVFilter *vflipFilter = avfilter_get_by_name("vflip"); + AVFilterContext *vflipFilter_ctx; + ret = avfilter_graph_create_filter(&vflipFilter_ctx, vflipFilter, "vflip", NULL, NULL, filter_graph); + if (ret < 0) { + printf("Fail to create vflip filter\n"); + return -1; + } + + //8. overlay filter:视频合成 + const AVFilter *overlayFilter = avfilter_get_by_name("overlay"); + AVFilterContext *overlayFilter_ctx; + ret = avfilter_graph_create_filter(&overlayFilter_ctx, overlayFilter, "overlay", + "y=0:H/2", NULL, filter_graph); + if (ret < 0) { + printf("Fail to create overlay filter\n"); + return -1; + } + // split用于分流 + // crop确定裁剪位置 + // vflip仅翻转图像 + // overlay确定视频叠加位置 + + // [main] + //input ----> split ---------------------> overlay --> output + // | ^ + // |[tmp] [flip]| + // | | + // v | + // +-----> crop --> vflip -------+ + + //9.过滤器连接 + // src filter to split filter + ret = avfilter_link(bufferSrc_ctx, 0, splitFilter_ctx, 0); + if (ret != 0) { + printf("Fail to link src filter and split filter\n"); + return -1; + } + // split filter's first pad to overlay filter's main pad + ret = avfilter_link(splitFilter_ctx, 0, overlayFilter_ctx, 0); + if (ret != 0) { + printf("Fail to link split filter and overlay filter main pad\n"); + return -1; + } + // split filter's second pad to crop filter + ret = avfilter_link(splitFilter_ctx, 1, cropFilter_ctx, 0); + if (ret != 0) { + printf("Fail to link split filter's second pad and crop filter\n"); + return -1; + } + // crop filter to vflip filter + ret = avfilter_link(cropFilter_ctx, 0, vflipFilter_ctx, 0); + if (ret != 0) { + printf("Fail to link crop filter and vflip filter\n"); + return -1; + } + // vflip filter to overlay filter's second pad + ret = avfilter_link(vflipFilter_ctx, 0, overlayFilter_ctx, 1); + if (ret != 0) { + printf("Fail to link vflip filter and overlay filter's second pad\n"); + return -1; + } + // overlay filter to sink filter + ret = avfilter_link(overlayFilter_ctx, 0, bufferSink_ctx, 0); + if (ret != 0) { + printf("Fail to link overlay filter and sink filter\n"); + return -1; + } + + //10. check filter graph + ret = avfilter_graph_config(filter_graph, NULL); + if (ret < 0) { + printf("Fail in filter graph\n"); + return -1; + } + + //11.打印filtergraph具体情况 + char *graph_str = avfilter_graph_dump(filter_graph, NULL); + FILE* graphFile = NULL; + fopen_s(&graphFile, "graphFile.txt", "w"); // 打印filtergraph的具体情况 + fprintf(graphFile, "%s", graph_str); + av_free(graph_str); + + //数据处理,按帧处理 + AVFrame *frame_in = av_frame_alloc(); + unsigned char *frame_buffer_in = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, in_width, in_height, 1)); + av_image_fill_arrays(frame_in->data, frame_in->linesize, frame_buffer_in, + AV_PIX_FMT_YUV420P, in_width, in_height, 1); + + AVFrame *frame_out = av_frame_alloc(); + unsigned char *frame_buffer_out = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, in_width, in_height, 1)); + av_image_fill_arrays(frame_out->data, frame_out->linesize, frame_buffer_out, + AV_PIX_FMT_YUV420P, in_width, in_height, 1); + + frame_in->width = in_width; + frame_in->height = in_height; + frame_in->format = AV_PIX_FMT_YUV420P; + uint32_t frame_count = 0; +} + + VideoCoder::VideoCoder(int width, int height, AVPixelFormat formt): mObserver(nullptr), mFrame(nullptr), @@ -54,15 +229,15 @@ VideoCoder::VideoCoder(int width, int height, AVPixelFormat formt): mCodecCtx->bit_rate = 1000; this->mDestHeight = 480; this->mDestWidth = 640; - mCodecCtx->width = this->mDestWidth; - mCodecCtx->height = this->mDestHeight; + mCodecCtx->width = this->mDestWidth; + mCodecCtx->height = this->mDestHeight; mCodecCtx->time_base.num = 1; mCodecCtx->time_base.den = 10; mCodecCtx->max_b_frames = 0; mCodecCtx->qmin = 10; mCodecCtx->qmax = 25; //mCodecCtx->flags |= AV_CODEC_FLAG_LOW_DELAY; - mCodecCtx->gop_size = 10; + mCodecCtx->gop_size = 25; mCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P; av_opt_set(mCodecCtx->priv_data, "preset", "superfast", 0); av_opt_set(mCodecCtx->priv_data, "tune", "zerolatency", 0); @@ -128,8 +303,8 @@ void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format) { ret = avcodec_encode_video2(mCodecCtx, &mAVPack, mFrame, &got_picture); if (got_picture > 0) { - fwrite(mAVPack.data, 1, mAVPack.size, p); - fflush(p); + // fwrite(mAVPack.data, 1, mAVPack.size, p); + // fflush(p); if(nullptr != this->mObserver) this->mObserver->OnGetCodeFrame(mAVPack.data, mAVPack.size); } @@ -138,9 +313,10 @@ void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format) { // 刷新coder,防止包挤压 av_packet_unref(&mAVPack); - av_freep(&pFrame[0]); + av_freep(&pFrame[0]); free(pFrame[0]); - //av_freep(&mFrame->data[0]); + + //av_freep(&mFrame->data[0]); //av_freep(&mFrame->data[0]); } diff --git a/media/VideoCoder.h b/media/VideoCoder.h index 4c66b28..4bbf112 100644 --- a/media/VideoCoder.h +++ b/media/VideoCoder.h @@ -11,7 +11,12 @@ extern "C" #include "libswscale/swscale.h" #include "libavutil/opt.h" #include "libavutil/imgutils.h" -}; +#include +#include +#include +#include + +} #include #else #ifdef __cplusplus @@ -60,7 +65,9 @@ public: void Encode(uint8_t*src,int size, enum AVPixelFormat format); void SetOberver(VideoCodeObserver *p) { this->mObserver = p; - } + } + int Filter(int width, int height, unsigned char* rgbData, int bitsPerPixel); + void SetOutPutPixel(unsigned int width,unsigned int height); private: int flushCoder(AVFormatContext *fmt_ctx, unsigned int stream_index); diff --git a/media/audiocaptureff.cpp b/media/audiocaptureff.cpp index 7f8f71a..a18beec 100644 --- a/media/audiocaptureff.cpp +++ b/media/audiocaptureff.cpp @@ -1,4 +1,7 @@ -#include "audiocaptureff.h" +#include "audiocaptureff.h" +#include +#include +#include #ifdef __MINGW32__ std::string WString2String(const std::wstring& ws) @@ -16,6 +19,12 @@ std::string WString2String(const std::wstring& ws) } #endif + +int ThreadCapture(CaptureAudioFfmpeg*p){ + + return 0; +} + vector CaptureAudioFfmpeg::EnumSpeakers() { vector ret; @@ -85,6 +94,8 @@ CaptureAudioFfmpeg::CaptureAudioFfmpeg(uint16_t rate, uint8_t channel) { mSampleRate = rate; mChanel = channel; + mStatus = STOP; + mThread = nullptr; } @@ -99,118 +110,131 @@ static char *dup_wchar_to_utf8(wchar_t *w) return s; } + + int CaptureAudioFfmpeg::InitCapture(wstring url, uint16_t rate, uint8_t channel) { - string fileAudioInput = dup_wchar_to_utf8((wchar_t *)url.c_str()); - AVInputFormat* imft = av_find_input_format("dshow"); + av_register_all(); + avdevice_register_all(); + + wchar_t w[200] = L"audio=耳机 (TimeBox-Evo-audio)"; + string fileAudioInput = dup_wchar_to_utf8(w); + static AVInputFormat* imft = av_find_input_format("dshow"); AVDictionary *format_opts = nullptr; av_dict_set_int(&format_opts, "audio_buffer_size", 20, 0); - if (0 > avformat_open_input(&mInfmt_ctx, fileAudioInput.c_str(), imft, &format_opts)) { - printf("failed input file\n"); + + int ret = avformat_open_input(&mInfmt_ctx,fileAudioInput.c_str(), imft, &format_opts); + if (0 > ret) { + printf("failed input file %d\n",ret); + char buf[1024]; + av_strerror(ret, buf, 1024); + printf("Couldn't open file %d(%s)\n", ret, buf); return -1; } - if (0 > avformat_find_stream_info(mInfmt_ctx, NULL)) { + if (0 > avformat_find_stream_info(mInfmt_ctx, &format_opts)) { printf("failed find stream info\n"); avformat_close_input(&mInfmt_ctx); return -1; } - int audio_index = -1; - audio_index = av_find_best_stream(mInfmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0); - if (-1 == audio_index) { - printf("failed find best stream\n"); - avformat_close_input(&mInfmt_ctx); - return -1; - } - //av_dump_format(infmt_ctx, 0, fileAudioInput.c_str(), 1); - //ENDļ + int audio_index = -1; + audio_index = av_find_best_stream(mInfmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0); + if (-1 == audio_index) { + printf("failed find best stream\n"); + avformat_close_input(&mInfmt_ctx); + return -1; + } - //򿪽 - static AVCodec* decodec = avcodec_find_decoder(mInfmt_ctx->streams[0]->codec->codec_id); - if (!decodec) { - printf("failed find decoder\n"); - return -1; - } - if (0 > avcodec_open2(mInfmt_ctx->streams[0]->codec, decodec, NULL)) { - printf("failed open decoder\n"); - return -1; - } - //END - //زʼ - initAudioFilters(); - //ENDزʼ - // - static AVCodec* codec = NULL; - //codec = avcodec_find_encoder_by_name("libmp3lame"); - codec = avcodec_find_encoder(AV_CODEC_ID_AAC); - static AVCodecContext* codec_ctx = NULL; - codec_ctx = avcodec_alloc_context3(codec); - // codec_ctx->bit_rate = 64000; - // inputContext->streams[0]->codec - codec_ctx->codec = codec; - codec_ctx->sample_rate = 48000; - codec_ctx->channel_layout = 3; - codec_ctx->channels = 2; - //codec_ctx->frame_size = 1024; - codec_ctx->sample_fmt = AV_SAMPLE_FMT_FLTP; - codec_ctx->codec_tag = 0; - codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + // 不需要编码器 + // av_dump_format(mInfmt_ctx, 0, fileAudioInput.c_str(), 1); + //END输入文件 - if (0 > avcodec_open2(codec_ctx, codec, NULL)) { - printf("failed open coder\n"); - avformat_close_input(&mInfmt_ctx); - avcodec_free_context(&codec_ctx); - return -1; - } - //END - //ļ - AVFormatContext* outfmt_ctx = NULL; - if (0 > avformat_alloc_output_context2(&outfmt_ctx, NULL, NULL, "aac.aac")) { - printf("failed alloc outputcontext\n"); - avformat_close_input(&mInfmt_ctx); - avcodec_free_context(&codec_ctx); - return -1; - } - AVStream* out_stream = avformat_new_stream(outfmt_ctx, codec_ctx->codec); - if (!out_stream) { - printf("failed new stream\n"); - avformat_close_input(&mInfmt_ctx); - avcodec_free_context(&codec_ctx); - avformat_close_input(&outfmt_ctx); - return -1; - } - avcodec_copy_context(out_stream->codec, codec_ctx); - // if (0 > avio_open(&outfmt_ctx->pb, "rtmp://localhost/testlive", AVIO_FLAG_WRITE)) { - if (0 > avio_open(&outfmt_ctx->pb, "aac.aac", AVIO_FLAG_WRITE)) { - printf("failed to open outfile\n"); - avformat_close_input(&mInfmt_ctx); - avcodec_free_context(&codec_ctx); - avformat_close_input(&outfmt_ctx); - return -1; - } - avformat_write_header(outfmt_ctx, NULL); - //ENDļ - #if 0 - AVFrame* Frame = av_frame_alloc(); - Frame->nb_samples = codec_ctx->frame_size; - Frame->format = codec_ctx->sample_fmt; - Frame->channel_layout = codec_ctx->channel_layout; - int size = av_samples_get_buffer_size(NULL, codec_ctx->channels, codec_ctx->frame_size, - codec_ctx->sample_fmt, 1); - uint8_t* frame_buf = (uint8_t *)av_malloc(size); - avcodec_fill_audio_frame(Frame, codec_ctx->channels, codec_ctx->sample_fmt, (const uint8_t*)frame_buf, size, 1); - int64_t in_channel_layout = av_get_default_channel_layout(codec_ctx->channels); - AVPacket pkt; - av_new_packet(&pkt, size); - pkt.data = NULL; - int got_frame = -1; - int delayedFrame = 0; - static uint8_t audio_buf[(MAX_AUDIO_FRAME_SIZE * 3) / 2]; - int audioCount = 0; - const uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 }; - AVFrame* Frame1 = av_frame_alloc(); - #endif - int loop = 1; - int delayedFrame = 0; +// //打开解码器 +// static AVCodec* decodec = avcodec_find_decoder(mInfmt_ctx->streams[0]->codec->codec_id); +// if (!decodec) { +// printf("failed find decoder\n"); +// return -1; +// } +// if (0 > avcodec_open2(mInfmt_ctx->streams[0]->codec, decodec, NULL)) { +// printf("failed open decoder\n"); +// return -1; +// } +// //END解码器 +// //重采样初始化 +// initAudioFilters(); +// //END重采样初始化 +// //编码器 +// static AVCodec* codec = NULL; +// //codec = avcodec_find_encoder_by_name("libmp3lame"); +// codec = avcodec_find_encoder(AV_CODEC_ID_AAC); +// static AVCodecContext* codec_ctx = NULL; +// codec_ctx = avcodec_alloc_context3(codec); +// // codec_ctx->bit_rate = 64000; +// // inputContext->streams[0]->codec +// codec_ctx->codec = codec; +// codec_ctx->sample_rate = 48000; +// codec_ctx->channel_layout = 3; +// codec_ctx->channels = 2; +// //codec_ctx->frame_size = 1024; +// codec_ctx->sample_fmt = AV_SAMPLE_FMT_FLTP; +// codec_ctx->codec_tag = 0; +// codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + +// if (0 > avcodec_open2(codec_ctx, codec, NULL)) { +// printf("failed open coder\n"); +// avformat_close_input(&mInfmt_ctx); +// avcodec_free_context(&codec_ctx); +// return -1; +// } +// //END编码器 +// //输出文件 +// AVFormatContext* outfmt_ctx = NULL; +// if (0 > avformat_alloc_output_context2(&outfmt_ctx, NULL, NULL, "aac.aac")) { +// printf("failed alloc outputcontext\n"); +// avformat_close_input(&mInfmt_ctx); +// avcodec_free_context(&codec_ctx); +// return -1; +// } +// AVStream* out_stream = avformat_new_stream(outfmt_ctx, codec_ctx->codec); +// if (!out_stream) { +// printf("failed new stream\n"); +// avformat_close_input(&mInfmt_ctx); +// avcodec_free_context(&codec_ctx); +// avformat_close_input(&outfmt_ctx); +// return -1; +// } +// avcodec_copy_context(out_stream->codec, codec_ctx); +//// if (0 > avio_open(&outfmt_ctx->pb, "rtmp://localhost/testlive", AVIO_FLAG_WRITE)) { +// if (0 > avio_open(&outfmt_ctx->pb, "aac.aac", AVIO_FLAG_WRITE)) { +// printf("failed to open outfile\n"); +// avformat_close_input(&mInfmt_ctx); +// avcodec_free_context(&codec_ctx); +// avformat_close_input(&outfmt_ctx); +// return -1; +// } +// avformat_write_header(outfmt_ctx, NULL); +// //END输出文件 +// #if 0 +// AVFrame* Frame = av_frame_alloc(); +// Frame->nb_samples = codec_ctx->frame_size; +// Frame->format = codec_ctx->sample_fmt; +// Frame->channel_layout = codec_ctx->channel_layout; +// int size = av_samples_get_buffer_size(NULL, codec_ctx->channels, codec_ctx->frame_size, +// codec_ctx->sample_fmt, 1); +// uint8_t* frame_buf = (uint8_t *)av_malloc(size); +// avcodec_fill_audio_frame(Frame, codec_ctx->channels, codec_ctx->sample_fmt, (const uint8_t*)frame_buf, size, 1); +// int64_t in_channel_layout = av_get_default_channel_layout(codec_ctx->channels); +// AVPacket pkt; +// av_new_packet(&pkt, size); +// pkt.data = NULL; +// int got_frame = -1; +// int delayedFrame = 0; +// static uint8_t audio_buf[(MAX_AUDIO_FRAME_SIZE * 3) / 2]; +// int audioCount = 0; +// const uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 }; +// AVFrame* Frame1 = av_frame_alloc(); +// #endif +// int loop = 1; +// int delayedFrame = 0; AVPacket packet; av_init_packet(&packet); packet.data = NULL; @@ -222,12 +246,19 @@ int CaptureAudioFfmpeg::InitCapture(wstring url, uint16_t rate, uint8_t channel) AVFrame* pSrcAudioFrame = av_frame_alloc(); int got_frame = 0; + const char *filename = "./audio.pcm"; + + // 文件操作 + FILE *outfile = fopen(filename,"wb+"); while (1) { - av_read_frame(mInfmt_ctx, &packet); - loop++; - if (packet.stream_index == audio_index) { - auto filterFrame = DecodeAudio(&packet, pSrcAudioFrame); + int ret = av_read_frame(mInfmt_ctx, &packet); + if (ret == 0) { + qDebug()<<"recv pack"<pb); - avformat_close_input(&mInfmt_ctx); + // av_free(pSrcAudioFrame); + // avio_close(outfmt_ctx->pb); + // avformat_close_input(&mInfmt_ctx); //avformat_close_input(&outfmt_ctx); return 0; } +int CaptureAudioFfmpeg::SetObserver(CaptureAudioObserver *ptr) +{ + if(nullptr == ptr) + return -1; + observer = ptr; + return 0; +} + +int CaptureAudioFfmpeg::StartCapture() +{ + if(this->mStatus == RUNNING) + return 0; + else{ + mStatus = RUNNING; + this->mThread = new std::thread(ThreadCapture,this); + mThreadId = this->mThread->get_id(); + } + + return 0; +} + int CaptureAudioFfmpeg::initAudioFilters() { char args[512]; @@ -390,13 +443,16 @@ AVFrame *CaptureAudioFfmpeg::DecodeAudio(AVPacket *packet, AVFrame *pSrcAudioFra auto length = avcodec_decode_audio4(codecContext, pSrcAudioFrame, &gotFrame, packet); if (length >= 0 && gotFrame != 0) { - if (av_buffersrc_add_frame_flags(mBuffersrcCtx, pSrcAudioFrame, AV_BUFFERSRC_FLAG_PUSH) < 0) { - av_log(NULL, AV_LOG_ERROR, "buffe src add frame error!\n"); + int ret = av_buffersrc_add_frame_flags(mBuffersrcCtx, pSrcAudioFrame, AV_BUFFERSRC_FLAG_PUSH) ; + if (ret < 0) { + char buf[1024]; + av_strerror(ret, buf, 1024); + av_log(NULL, AV_LOG_ERROR,"av_buffersrc_add_frame_flags %d(%s)\n", ret, buf); return nullptr; } filtFrame = av_frame_alloc(); - int ret = av_buffersink_get_frame_flags(mBuffersinkCtx, filtFrame, AV_BUFFERSINK_FLAG_NO_REQUEST); + ret = av_buffersink_get_frame_flags(mBuffersinkCtx, filtFrame, AV_BUFFERSINK_FLAG_NO_REQUEST); if (ret < 0) { av_frame_free(&filtFrame); diff --git a/media/audiocaptureff.h b/media/audiocaptureff.h index 2b03698..c79199e 100644 --- a/media/audiocaptureff.h +++ b/media/audiocaptureff.h @@ -51,17 +51,18 @@ public: vector EnumSpeakers(); CaptureAudioFfmpeg(uint16_t rate, uint8_t channel); int InitCapture(wstring url,uint16_t rate,uint8_t channel); + int SetObserver(CaptureAudioObserver*); + int StartCapture(); + std::thread::id mThreadId; /* ~CaptureAudio(); - int StartCapture(); void StopCapture(); - int SetObserver(CaptureAudioObserver*); int OnCallBack(const void* input, void* output, unsigned long frameCount); void AddCnt(unsigned int x) {this->mSize += x;}; */ private: - std::thread mThread; + std::thread *mThread; uint16_t mSampleRate; //采样率 uint16_t mChanel; //通道号 uint16_t mSamplefmt; @@ -80,6 +81,9 @@ private: int flush_encoder(AVFormatContext *fmt_ctx, unsigned int stream_index); AVFrame *DecodeAudio(AVPacket* packet, AVFrame*pSrcAudioFrame); + }; + + #endif // AUDIOCAPTUREFF_H diff --git a/qss/css/QssMainWindow.css b/qss/css/QssMainWindow.css new file mode 100644 index 0000000..3a28dc5 --- /dev/null +++ b/qss/css/QssMainWindow.css @@ -0,0 +1,8 @@ + +QFrame#window { + border: 1px solid black; + font-style: normal; + background: rgb(239,242,245); +} + + diff --git a/qss/css/QssTitleBar.css b/qss/css/QssTitleBar.css new file mode 100644 index 0000000..90be03b --- /dev/null +++ b/qss/css/QssTitleBar.css @@ -0,0 +1,65 @@ +QWidget#qssTitleBar{ + color: white; + background: rgb(51,101,177); + border: 0px; + margin: 0px; + +} +QWidget#qssTitleBar > QPushButton#titlebaricon{ + background: rgb(51,101,177); + width: 25px; + height:25px; +} + +QWidget#qssTitleBar > QPushButton#titlebarclosebtn{ + image: url(":/qss/icon/btn_close_down.svg"); + background: rgb(51,101,177); + width: 25px; + height:25px; + margin-left: 1px; +} +QWidget#qssTitleBar >QPushButton#titlebarmaxbtn{ + background: rgb(51,101,177); + width: 25px; + height:25px; + margin-left: 1px; + image: url(":/qss/icon/btn_max_normal.svg"); + +} +QWidget#qssTitleBar >QPushButton#titlebarclosebtn:enabled:hover{ + background: red; +} +QWidget#qssTitleBar >QPushButton#titlebarminbtn{ + image: url(":/qss/icon/btn_mini_down.svg"); + background: rgb(51,101,177); + width: 25px; + height:25px; + margin-left: 1px; +} +QWidget#qssTitleBar >QPushButton#titlebarminbtn:enabled:hover{ + background: rgb(187, 212, 238); +} +QWidget#qssTitleBar >QPushButton#titlebarrestorebtn{ + image: url(":/qss/icon/btn_max_normal.svg"); + background: rgb(187, 212, 238); + width: 25px; + height:25px; + margin-left: 1px; + margin-right: 2px; +} +QWidget#qssTitleBar >QPushButton#titlebarrestorebtn:enabled:hover{ + background: rgb(187, 212, 238); +} +QWidget#qssTitleBar >QPushButton#btn_serial:!enabled { + background: rgb(180, 180, 180); + color: white; +} +QWidget#qssTitleBar >QPushButton#titlebarmaxbtn:enabled:hover{ + background: rgb(100, 160, 220); +} +QWidget#qssTitleBar > QLabel#title{ + color: white; + font-size: 13px; + font-family: monospace; +} + diff --git a/qss/css/basic.css b/qss/css/basic.css new file mode 100644 index 0000000..3299e21 --- /dev/null +++ b/qss/css/basic.css @@ -0,0 +1,149 @@ + +QPushButton:enabled { + background: rgb(22,155,213); + color: white; + border-radius:3px; +} + +QPushButton:!enabled { + background: white; + color: black; +} + +QPushButton:enabled:hover { + background: rgb(100, 160, 220); +} + +QPushButton:enabled:pressed { + background: rgb(120, 170, 220); +} + + + +QLabel{ + +} +/**********下拉列表**********/ +QComboBox { + height: 25px; + border: 1px solid rgb(111, 156, 207); + background: white; + border-radius:3px; +} + +QComboBox:enabled { + color: rgb(84, 84, 84); +} + +QComboBox:!enabled { + color: rgb(80, 80, 80); +} + +QComboBox:enabled:hover, QComboBox:enabled:focus { + color: rgb(51, 51, 51); +} + +QComboBox::drop-down { + width: 20px; + border: none; + background: transparent; +} + +QComboBox::drop-down:hover { + background: rgba(0, 0, 0, 30); +} + +QComboBox::down-arrow { + image: url(:/qss/icon/combo_arrow.png); + max-height:30%; + max-width: 30%; +} + +QComboBox::down-arrow:on { + top: 1px; +} + +QComboBox QAbstractItemView { + border: 1px solid rgb(111, 156, 207); + background: white; + outline: none; +} + +QComboBox QAbstractItemView::item { + height: 25px; + color: rgb(73, 73, 73); +} + +QComboBox QAbstractItemView::item:selected { + background: rgb(232, 241, 250); + color: rgb(2, 65, 132); +} + + + +QTabWidget{ + margin-left:10; + background: rgb(239,242,245); + +} + +QTabWidget::pane { + border: none; + +} + +QTabWidget::tab-bar { + border: none; +} + +QTabBar::tab { + border: none; + border-top-left-radius: 4px; + color: white; + background: rgb(239,242,245); + color: black; + + height: 28px; + min-width: 85px; + margin-right: 5px; +} + +QTabBar::tab:hover { + background: rgb(51,101,177); +} + +QTabBar::tab:selected { + color: white; + background: rgb(51,101,177); +} + + +QTableView { + border: none; +} +QTableView::item { + padding-left: 5px; + padding-right: 5px; + background: white; +} +QTableView::item:selected { + border: 1px solid black; + color: rgb(65, 65, 65); + +} +QTableView::item:selected:!active { + color: rgb(65, 65, 65); +} +QTableView::indicator { + border: 1px solid black; + + width: 20px; + height: 20px; +} + + +QLineEdit { + border: 1px solid rgb(111, 156, 207); + background: white; + border-radius:3px; +} diff --git a/qss/css/corrugation_form.css b/qss/css/corrugation_form.css new file mode 100644 index 0000000..b7e5d55 --- /dev/null +++ b/qss/css/corrugation_form.css @@ -0,0 +1,192 @@ + +QPushButton:enabled { + background: rgb(22,155,213); + color: white; + border-radius:3px; +} + +QPushButton:!enabled { + background: white; + color: black; +} + +QPushButton:enabled:hover { + background: rgb(100, 160, 220); +} + +QPushButton:enabled:pressed { + background: rgb(120, 170, 220); +} + + +QPushButton#pushButton:enabled { + background: white; + color: black; + border-radius:3px; +} + +QPushButton#pushButton:!enabled { + background: rgb(180, 180, 180); + color: white; +} + +QPushButton#pushButton:enabled:hover{ + background: rgb(100, 160, 220); +} + +QPushButton#pushButton:enabled:pressed{ + background: rgb(120, 170, 220); +} + +QLabel{ + font-size: 13px; +} +/**********б**********/ +QComboBox { + height: 25px; + border: 1px solid rgb(111, 156, 207); + background: white; + border-radius:3px; +} + +QComboBox:enabled { + color: rgb(84, 84, 84); +} + +QComboBox:!enabled { + color: rgb(80, 80, 80); +} + +QComboBox:enabled:hover, QComboBox:enabled:focus { + color: rgb(51, 51, 51); +} + +QComboBox::drop-down { + width: 20px; + border: none; + background: transparent; +} + +QComboBox::drop-down:hover { + background: rgba(0, 0, 0, 30); +} + +QComboBox::down-arrow { + image: url(:/qss/icon/combo_arrow.png); + max-height:30%; + max-width: 30%; +} + +QComboBox::down-arrow:on { + top: 1px; +} + +QComboBox QAbstractItemView { + border: 1px solid rgb(111, 156, 207); + background: white; + outline: none; +} + +QComboBox QAbstractItemView::item { + height: 25px; + color: rgb(73, 73, 73); +} + +QComboBox QAbstractItemView::item:selected { + background: rgb(232, 241, 250); + color: rgb(2, 65, 132); +} + + + +QTabWidget{ + margin-left:10; + background: rgb(239,242,245); + +} + +QTabWidget::pane { + border: none; + +} + +QTabWidget::tab-bar { + border: none; +} + +QTabBar::tab { + border: none; + border-top-left-radius: 4px; + color: white; + background: rgb(239,242,245); + color: black; + + height: 28px; + min-width: 85px; + margin-right: 5px; +} + +QTabBar::tab:hover { + background: rgb(51,101,177); +} + +QTabBar::tab:selected { + color: white; + background: rgb(51,101,177); +} + + +QTableView { + border: 1px solid grey; +} +QTableView::item { + padding-left: 5px; + padding-right: 5px; + background: white; +} +QTableView::item:selected { + border: 1px solid black; + background: rgba(255, 255, 255, 30); + color: black; +} +QTableView::item:selected:!active { + color: rgb(65, 65, 65); +} +QTableView::indicator { + border: 1px solid black; + + width: 20px; + height: 20px; +} + + +QTableView::indicator:enabled:unchecked { + + image: url(:/White/checkBox); +} +QTableView::indicator:enabled:unchecked:hover { + image: url(:/White/checkBoxHover); +} +QTableView::indicator:enabled:unchecked:pressed { + image: url(:/White/checkBoxPressed); +} +QTableView::indicator:enabled:checked { + image: url(:/White/checkBoxChecked); +} +QTableView::indicator:enabled:checked:hover { + image: url(:/White/checkBoxCheckedHover); +} +QTableView::indicator:enabled:checked:pressed { + image: url(:/White/checkBoxCheckedPressed); +} +QTableView::indicator:enabled:indeterminate { + image: url(:/White/checkBoxIndeterminate); +} +QTableView::indicator:enabled:indeterminate:hover { + image: url(:/White/checkBoxIndeterminateHover); +} +QTableView::indicator:enabled:indeterminate:pressed { + image: url(:/White/checkBoxIndeterminatePressed); +} + + diff --git a/qss/css/dark.css b/qss/css/dark.css new file mode 100644 index 0000000..c7021da --- /dev/null +++ b/qss/css/dark.css @@ -0,0 +1,866 @@ +/* +Colour scheme used: +- White (text): #eff0f1 +- Dark black (main bg): #272a2d +- Lighter dark black (menu bar): #373b3f +- Dark blue: #18465d +- Gray: #76797C +- Red (accents): #db1c49 + +Useful reference on QSS: + - http://doc.qt.io/qt-5/stylesheet-reference.html#alternate-background-color-prop + +Be sure to change all image urls to the appropriate folder on your system. +*/ + + +QPushButton#btn_serial:enabled { + border-image: url(:/qss/icon/btn_serial.png); + background: rgb(120, 170, 220); + color: white; + margin-left: 10; + margin-top:5; +} +QPushButton#btn_serial:!enabled { + background: rgb(180, 180, 180); + color: white; +} + +QPushButton#btn_serial:enabled:hover{ + background: rgb(100, 160, 220); +} +QPushButton#btn_serial:enabled:pressed{ + background: rgb(0, 78, 161); +} + + +QPushButton#btn_process:enabled { + background: rgb(120, 170, 220); + color: white; + margin-left: 5; + margin-top:5; +} +QPushButton#btn_process:!enabled { + background: rgb(180, 180, 180); + color: white; +} +QPushButton#btn_process:enabled:hover{ + background: rgb(100, 160, 220); +} +QPushButton#btn_process:enabled:pressed{ + background: rgb(0, 78, 161); +} + +/*================================================================ +QWidget +================================================================*/ +QWidget { + color: #eff0f1; + background-color: #272a2d; + selection-background-color: #db1c49; + selection-color: #eff0f1; +} + +QWidget::item:hover { + background-color: #18465d; + color: #eff0f1; +} + +QWidget::item:selected { + background-color: #18465d; +} + +/*================================================================ +QCheckBox/QGroupBox +================================================================*/ +QCheckBox { + spacing: 5px; + outline: none; + color: #eff0f1; + margin-bottom: 2px; +} + +QCheckBox:disabled { + color: #76797C; +} + +QCheckBox::indicator, +QGroupBox::indicator { + width: 18px; + height: 18px; +} + +QGroupBox::indicator { + margin-left: 2px; +} + +QCheckBox::indicator:unchecked { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:focus, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed { + border: none; + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_checked_focus.png); +} + +QCheckBox::indicator:indeterminate { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_indeterminate.png); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed { + image: url(C:/Users/franc/AppData/Roaming/TeXstudio/rc/checkbox_indeterminate_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_unchecked_disabled.png); +} + +/*================================================================ +QMenuBar - e.g. Main toolbar (file/edit/idefix etc.) +================================================================*/ +QMenuBar { + color: #eff0f1; + background-color: #373b3f; +} + +QMenuBar::item { + background: transparent; +} + +/*================================================================ +QMenu +================================================================*/ +QMenu { + border: 1px solid #76797C; + color: #eff0f1; + margin: 2px; +} + +QMenu::separator { + height: 2px; + background: #76797C; + margin-left: 5px; + margin-right: 5px; +} + +/*================================================================ +QToolbar +================================================================*/ +QToolBar { + border: 1px solid #393838; + background: 1px solid #272a2d; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/Hmovetoolbar.png); +} + +QToolBar::handle:vertical { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/Vmovetoolbar.png); +} + +QToolBar::separator:horizontal { + width: 2px; + margin: 3px 10px; + background-color: #76797C; +} + +QToolBar::separator:vertical { + height: 2px; + margin: 10px 3px; + background-color: #76797C; +} + +/*================================================================ +QScrollBar - e.g. Scrollbar in internal PDFviewer, editor window etc. +================================================================*/ +QScrollBar:horizontal { + height: 25px; + margin: 3px 27px 3px 27px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #000000; +} + +QScrollBar::handle:horizontal { + background-color: #76797C; + min-width: 15px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/right_arrow_disabled.png); + width: 20px; + height: 20px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/left_arrow_disabled.png); + height: 20px; + width: 20px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/right_arrow.png); + height: 20px; + width: 20px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/left_arrow.png); + height: 20px; + width: 20px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: #000000; + width: 25px; + margin: 27px 3px 27px 3px; + border: 1px solid #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: #76797C; + min-height: 15px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/up_arrow_disabled.png); + height: 20px; + width: 20px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/down_arrow_disabled.png); + height: 20px; + width: 20px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/up_arrow.png); + height: 20px; + width: 20px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/down_arrow.png); + height: 20px; + width: 20px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +/*================================================================ +QTabBar - e.g. File tabs (top), Bottom panel tabs (top), Autocompleter window tabs (bottom) +================================================================*/ +QTabBar { + qproperty-drawBase: 0; /* important */ + background-color: transparent; +} + +/* Workaround for QTabBars created from docked QDockWidgets which don't draw the border if not set and reseted as follows: */ +QTabBar { + border-top: 1px transparent #76797C; /* set color for all QTabBars */ +} +QDialog QTabBar { + border-color: transparent; /* set color for QTabBars inside Preferences dialog */ +} +/* */ + +QTabBar::close-button { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close.png); + background: transparent; + margin-top: 6px; + margin-bottom: 6px; +} + +QTabBar::close-button:hover { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close-hover.png); + background: transparent; + margin-top: 6px; + margin-bottom: 6px; +} + +QTabBar::close-button:pressed { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close-pressed.png); + background: transparent; + margin-top: 6px; + margin-bottom: 6px; +} + +/* TOP TABS */ + +QTabBar::tab:top { + color: #eff0f1; + border: 1px solid #76797C; + border-bottom: 1px transparent black; + background-color: #31363b; + padding: 5px; + min-width: 50px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:top:selected { + color: #eff0f1; + background-color: #54575B; + border: 2px solid #76797C; + border-bottom: 3px solid #3daee9; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:top:!selected:hover { + background-color: #18465d; +} + +/* BOTTOM TABS */ + +QTabBar::tab:bottom { + color: #eff0f1; + border: 1px solid #76797C; + border-top: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + min-width: 50px; +} + +QTabBar::tab:bottom:selected { + color: #eff0f1; + background-color: #54575B; + border: 2px solid #76797C; + border-top: 3px solid #3daee9; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #18465d; +} + +/*================================================================ +QDockWidget - e.g. "Search" header in internal PDF viewer +================================================================*/ +QDockWidget { + titlebar-close-icon: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); + titlebar-normal-icon: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); +} + +QDockWidget::title { + background: #373b3f; + color: transparent; + border: 1px transparent; + text-align: left; +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: transparent; + padding: 0px; + icon-size: 25px; + background: transparent; +} + +QDockWidget::float-button { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/undock.png); + subcontrol-position: right center; + left: -50px; +} + +QDockWidget::close-button { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close.png); + subcontrol-position: right center; + left: -10px; +} + +QDockWidget::float-button:hover { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/undock-pressed.png); + subcontrol-position: right center; + left: -50px; +} + +QDockWidget::close-button:hover { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close-pressed.png); + subcontrol-position: right center; + left: -10px; +} + +QDockWidget::close-button:pressed { + padding: 2px -2px -2px 2px; + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/close-pressed.png); +} + +QDockWidget::float-button:pressed { + padding: 2px -2px -2px 2px; + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/undock-pressed.png); +} + +QDockWidget QListView { + outline: 0; + background: #272a2d; + alternate-background-color: #373b3f; + color: #eff0f1; +} + +/*================================================================ +QTreeView, QListView +================================================================*/ +QTreeView, +QListView { + border: 1px solid #76797C; + background-color: #232629; +} + +QTreeView:branch:selected, +QTreeView:branch:hover { + background: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/branch_open-on.png); +} + +QListView::item:!selected:hover, +QTreeView::item:!selected:hover { + background: #18465d; + outline: 0; + color: #eff0f1; +} + +QListView::item:selected:hover, +QTreeView::item:selected:hover { + background: #287399; + color: #eff0f1; +} + +QTreeView::indicator:checked, +QListView::indicator:checked { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_checked.png); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_unchecked.png); +} + +QTreeView::indicator:checked:hover, +QTreeView::indicator:checked:focus, +QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_checked_focus.png); +} + +QTreeView::indicator:unchecked:hover, +QTreeView::indicator:unchecked:focus, +QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/checkbox_unchecked_focus.png); +} + +/*================================================================ +QPushButton +================================================================*/ +QPushButton { + color: #eff0f1; + background-color: #31363b; + border-width: 1px; + border-color: #76797C; + border-style: solid; + padding: 5px; + border-radius: 2px; + outline: none; +} + +QPushButton:disabled { + background-color: #31363b; + border-width: 1px; + border-color: #454545; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 2px; + color: #454545; +} + +QPushButton:hover, +QPushButton:focus { + background-color: #18465d; + color: #ffffff; +} + +QPushButton:pressed { + background-color: #18465d; + padding-top: -15px; + padding-bottom: -17px; +} + +QPushButton:checked { + background-color: #76797C; + border-color: #6A6969; +} + +/*================================================================ +QToolButton - e.g. Reset pushbutton in GUI scaling, toolbar buttons +================================================================*/ +QToolButton { + text-align: center; +} + +/*================================================================ +QComboBox +================================================================*/ +QComboBox { + selection-background-color: #db1c49; + border: 1px solid #76797C; + border-radius: 2px; + padding: 5px; + min-width: 75px; +} + +QComboBox:hover, +QPushButton:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover, +QTreeView:hover { + border: 1px solid #3daee9; + color: #eff0f1; +} + +QComboBox:on { + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView { + background-color: #232629; + border-radius: 2px; + border: 1px solid #76797C; + selection-background-color: #18465d; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 35px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus { + image: url(C:/Users/user/AppData/Roaming/TeXstudio/rc/down_arrow.png); +} + +/*================================================================ +QLineEdit - e.g. Search textbox in internal pdf viewer +================================================================*/ +QLineEdit { + selection-background-color: #db1c49; + border: 1px solid #76797C; +} + +/*================================================================ +QHeaderView +================================================================*/ +QHeaderView { + background-color: #31363b; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: #31363b; + color: #eff0f1; + padding: 5px; + border: 1px solid #76797C; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one { + border-top: 1px solid #76797C; +} + +QHeaderView::section::vertical { + border-top: transparent; +} + +QHeaderView::section::horizontal::first, +QHeaderView::section::horizontal::only-one { + border-left: 1px solid #76797C; +} + +QHeaderView::section::horizontal { + border-left: transparent; +} + +QHeaderView::section:checked { + color: #ffffff; + background-color: #31363B; +} + +/*================================================================ +QTableWidget +================================================================*/ +QTableWidget { + background-color: #373b3f; /*#232629;*/ + gridline-color: yellow; /*#31363b;*/ +} + +QTableWidget::item { + outline-style: none; + color: #eff0f1; + background: #31363b; + border: none; + border-bottom: 1px solid #31363b; +} + +/*================================================================ +QTableView - e.g. configMenu()->Syntax highlighting table +================================================================*/ +QTableView { + border: 1px solid #76797C; + gridline-color: #31363b; + background-color: #232629; +} + +QTableView, +QHeaderView { + border-radius: 0px; +} + +QTableView::item:hover { + background: #18465d; +} + +QTableView::item:pressed, +QListView::item:pressed, +QTreeView::item:pressed { + background: #18465d; + color: #eff0f1; +} + +QTableView::item:selected:active, +QTreeView::item:selected:active, +QListView::item:selected:active { + background: #287399; + color: #eff0f1; +} + +QTableCornerButton::section { + background-color: #31363b; + border: 1px transparent #76797C; + border-radius: 0px; +} + +/*================================================================ +QDialog - e.g. config menu, About TXS window, Wizards +================================================================*/ +QDialog { + background-color: #373b3f; +} + +QDialog QCheckBox, +QDialog QLabel { + background-color: transparent; +} + +QDialog QToolButton { /*Same as QPushButton*/ + color: #eff0f1; + background-color: #31363b; + border-width: 1px; + border-color: #76797C; + border-style: solid; + padding: 5px; + border-radius: 2px; + outline: none; +} + +QDialog QToolButton:hover, +QDialog QToolButton:focus { /*Same as QPushButton*/ + background-color: #18465d; + color: #ffffff; +} + +QDialog QToolButton:pressed { /*Same as QPushButton*/ + background-color: #18465d; + padding-top: -15px; + padding-bottom: -17px; +} + +/* Specific to table in "configMenu->Syntax highlighting" (hopefully) */ + +QDialog QTableWidget::item, +QDialog QTableView::item:hover { /* Turn off hover colour for cells -- it's distracting */ + background-color: #31363b; +} + +/* */ + +/*================================================================ +QSlider - e.g. GUI scaling settings +================================================================*/ +QSlider, +QSlider:active, +QSlider:!active { + border: none; + background-color: transparent; +} + +QSlider::groove:horizontal { + height: 12px; +} + +QSlider::groove:vertical { + width: 12px; +} + +QSlider::handle:horizontal, +QSlider::handle:vertical { + background-color: #db1c49; + border: 1px solid #db1c49; + width: 10px; + height: 15px; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + border: 1px solid #A21538; + background-color: #A21538; +} + +/*================================================================ +QToolTip - e.g. popup upon hovering on filename tabs +================================================================*/ +QToolTip { + border: 1px solid #272a2d; + background-color: #373b3f; + color: white; + padding: 0px; /*remove padding, for fix combobox tooltip.*/ +} diff --git a/qss/css/mainwindow.css b/qss/css/mainwindow.css new file mode 100644 index 0000000..cf55514 --- /dev/null +++ b/qss/css/mainwindow.css @@ -0,0 +1,45 @@ + +QTabBar{ + background: rgb(22,155,213); +} +QTabBar::tab { + border: none; + border-top-left-radius: 4px; + color: white; + background: rgb(239,242,245); + color: black; + + height: 28px; + min-width: 85px; + margin-right: 5px; +} + +QTabBar::tab:hover { + background: rgb(51,101,177); +} + +QTabBar::tab:selected { + color: white; + background: rgb(51,101,177); +} + + + +QPushButton:enabled { + background: rgb(22,155,213); + color: white; + border-radius:3px; +} + +QPushButton:!enabled { + background: white; + color: black; +} + +QPushButton:enabled:hover { + background: rgb(100, 160, 220); +} + +QPushButton:enabled:pressed { + background: rgb(120, 170, 220); +} diff --git a/qss/css/qss.css b/qss/css/qss.css new file mode 100644 index 0000000..49d6aee --- /dev/null +++ b/qss/css/qss.css @@ -0,0 +1,779 @@ +QDialog{ + border: 1px solid rgb(rgb(0, 78, 161)); + padding: 5px; + background: rgb(232, 241, 252); +} + +QMainWindow{ + border: none; + background: rgb(255, 255, 255); +} + +QMainWindow::title{ + text-align: right; /* align the text to the left */ + background: rgb(7,71,166); + padding-left: 5px; +} + +QWidget { +/* font-size: 10px;*/ +} + + +QDockWidget{ + background: rgb(187, 212, 238); +} +/*QFrame#window{ + background: rgba(244,245,247,100); +}*/ + +QWidget#remoteWidget { + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + border: 1px solid rgb(111, 156, 207); + border-left: none; + background: transparent; +} + +StyledWidget { + qproperty-normalColor: rgb(65, 65, 65); + qproperty-disableColor: rgb(180, 180, 180); + qproperty-highlightColor: rgb(0, 160, 230); + qproperty-errorColor: red; +} + +QProgressIndicator { + qproperty-color: rgb(2, 65, 132); +} + +/**********提示**********/ +QToolTip{ + border: 1px solid rgb(111, 156, 207); + background: white; + color: rgb(51, 51, 51); +} + +/**********菜单栏**********/ +QMenuBar { +/* background: rgb(7,71,166);*/ + border: 1px solid rgb(111, 156, 207); + border-left: none; + border-right: none; +} +QMenuBar::item { + border: 1px solid transparent; + padding: 5px 10px 5px 10px; + height : 30px; + background: "white"; + text-aligin: center; + font-size: 20px;; +} +QMenuBar::item:enabled { + font-size: 20px;; + background: rgb(198, 224, 252); +} +QMenuBar::item:!enabled { + font-size: 20px;; + background: rgb(198, 224, 252); +} +QMenuBar::item:enabled:selected { + font-size: 20px;; + background: rgb(198, 224, 252); +} + +/**********菜单**********/ +QMenu { + border: 1px solid rgb(2, 65, 132); + background: rgb(232, 241, 250); + height : 50px; + +} + +QssMessageBox#messagebox{ + background: rgb(0, 0, 250); +} + +QMenu::item { + height: 22px; + padding: 0px 25px 0px 20px; +} + +QMenu::item:enabled { + color: rgb(84, 84, 84); +} + +QMenu::item:!enabled { + color: rgb(155, 155, 155); +} + +QMenu::item:enabled:selected { + color: rgb(2, 65, 132); + background: rgba(255, 255, 255, 200); +} + +QMenu::separator { + height: 1px; + background: rgb(111, 156, 207); +} +QMenu::indicator { + width: 13px; + height: 13px; +} + +QMenu::icon { + padding-left: 2px; + padding-right: 2px; +} + +/**********状态栏**********/ +QStatusBar { + background: rgb(111, 156, 207); + border: 1px solid rgb(111, 156, 207); + border-left: none; + border-right: none; + border-bottom: none; +} + +QStatusBar::item { + border: none; + border-right: 1px solid rgb(111, 156, 207); +} + +/**********分组框**********/ +QGroupBox { + border: 1px solid rgb(111, 156, 207); + border-radius: 4px; + margin-top: 10px; +} + +QGroupBox::title { + color: rgb(56, 99, 154); + top: -12px; + left: 10px; +} + +QTabWidget{ + margin-left:10; +} +/**********页签项**********/ +QTabWidget::pane { + border: none; + border-top: 3px solid rgb(0, 78, 161); + background: rgb(187, 212, 238); +} + +QTabWidget::tab-bar { + border: none; +} + +QTabBar::tab { + border: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + color: white; + background: rgb(120, 170, 220); + height: 28px; + min-width: 85px; + margin-right: 5px; + padding-left: 5px; + padding-right: 5px; +} + +QTabBar::tab:hover { + background: rgb(0, 78, 161); +} + +QTabBar::tab:selected { + color: white; + background: rgb(0, 78, 161); +} + +QTabWidget#tabWidget::pane { + border: 1px solid rgb(111, 156, 207); + background: rgb(232, 241, 252); + margin-top: -1px; +} + +QTabBar#tabBar::tab { + border: 1px solid rgb(111, 156, 207); + border-bottom: none; + color: rgb(70, 71, 73); + background: transparent; +} +QTabBar#tabBar::tab:hover { + color: rgb(2, 65, 132); +} +QTabBar#tabBar::tab:selected { + color: rgb(2, 65, 132); + background: rgb(232, 241, 252); +} + +/**********表头**********/ +QHeaderView{ + border: 1px solid black; + border-bottom: 3px solid rgb(0, 78, 161); + background: transparent; + min-height: 30px; +} +QHeaderView::section:horizontal { + border: none; + color: rgb(2, 65, 132); + background: transparent; + padding-left: 5px; +} +QHeaderView::section:horizontal:hover { + color: white; + background: rgb(0, 78, 161); +} +QHeaderView::section:horizontal:pressed { + color: white; + background: rgb(6, 94, 187); +} +QHeaderView::up-arrow { + width: 13px; + height: 11px; + padding-right: 5px; + image: url(:/White/topArrow); + subcontrol-position: center right; +} +QHeaderView::up-arrow:hover, QHeaderView::up-arrow:pressed { + image: url(:/White/topArrowHover); +} +QHeaderView::down-arrow { + width: 13px; + height: 11px; + padding-right: 5px; + image: url(:/White/bottomArrow); + subcontrol-position: center right; +} +QHeaderView::down-arrow:hover, QHeaderView::down-arrow:pressed { + image: url(:/White/bottomArrowHover); +} +/**********TreeView**********/ +QTreeView::item { + height: 25px; + border-right: 0.5px solid grey; + background: transparent; +} +QTreeView::item:hover { + background : #DBDBDB; +} + +QTreeView::item:selected { + background : grey; +} +/**********表格**********/ +QTableView { + border: 1px solid grey; + background: rgb(224, 238, 255); + gridline-color: rgb(111, 156, 207); +} +QTableView::item { + padding-left: 5px; + padding-right: 5px; + border: 1px solid black; + background: white; +} +QTableView::item:selected { + border: 1px solid black; + + background: rgba(255, 255, 255, 30); +} +QTableView::item:selected:!active { + color: rgb(65, 65, 65); +} +QTableView::indicator { + border: 1px solid black; + + width: 20px; + height: 20px; +} + + +QTableView::indicator:enabled:unchecked { + + image: url(:/White/checkBox); +} +QTableView::indicator:enabled:unchecked:hover { + image: url(:/White/checkBoxHover); +} +QTableView::indicator:enabled:unchecked:pressed { + image: url(:/White/checkBoxPressed); +} +QTableView::indicator:enabled:checked { + image: url(:/White/checkBoxChecked); +} +QTableView::indicator:enabled:checked:hover { + image: url(:/White/checkBoxCheckedHover); +} +QTableView::indicator:enabled:checked:pressed { + image: url(:/White/checkBoxCheckedPressed); +} +QTableView::indicator:enabled:indeterminate { + image: url(:/White/checkBoxIndeterminate); +} +QTableView::indicator:enabled:indeterminate:hover { + image: url(:/White/checkBoxIndeterminateHover); +} +QTableView::indicator:enabled:indeterminate:pressed { + image: url(:/White/checkBoxIndeterminatePressed); +} + +/**********滚动条-水平**********/ +QScrollBar:horizontal { + height: 20px; + background: transparent; + margin-top: 3px; + margin-bottom: 3px; +} +QScrollBar::handle:horizontal { + height: 20px; + min-width: 30px; + background: rgb(170, 200, 230); + margin-left: 15px; + margin-right: 15px; +} +QScrollBar::handle:horizontal:hover { + background: rgb(165, 195, 225); +} +QScrollBar::sub-line:horizontal { + width: 15px; + background: transparent; + image: url(:/White/arrowLeft); + subcontrol-position: left; +} +QScrollBar::add-line:horizontal { + width: 15px; + background: transparent; + image: url(:/White/arrowRight); + subcontrol-position: right; +} +QScrollBar::sub-line:horizontal:hover { + background: rgb(170, 200, 230); +} +QScrollBar::add-line:horizontal:hover { + background: rgb(170, 200, 230); +} +QScrollBar::add-page:horizontal,QScrollBar::sub-page:horizontal { + background: transparent; +} + +/**********滚动条-垂直**********/ +QScrollBar:vertical { + width: 20px; + background: transparent; + margin-left: 3px; + margin-right: 3px; +} +QScrollBar::handle:vertical { + width: 20px; + min-height: 30px; + background: rgb(170, 200, 230); + margin-top: 15px; + margin-bottom: 15px; +} +QScrollBar::handle:vertical:hover { + background: rgb(165, 195, 225); +} +QScrollBar::sub-line:vertical { + height: 15px; + background: transparent; + image: url(:/White/topArrow); + subcontrol-position: top; +} +QScrollBar::add-line:vertical { + height: 15px; + background: transparent; + image: url(:/White/bottomArrow); + subcontrol-position: bottom; +} +QScrollBar::sub-line:vertical:hover { + background: rgb(170, 200, 230); +} +QScrollBar::add-line:vertical:hover { + background: rgb(170, 200, 230); +} +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: transparent; +} + +QScrollBar#verticalScrollBar:vertical { + margin-top: 30px; +} + +/**********下拉列表**********/ +QComboBox { + height: 25px; + border: 1px solid rgb(111, 156, 207); + background: white; +} +QComboBox:enabled { + color: rgb(84, 84, 84); +} +QComboBox:!enabled { + color: rgb(80, 80, 80); +} +QComboBox:enabled:hover, QComboBox:enabled:focus { + color: rgb(51, 51, 51); +} +QComboBox::drop-down { + width: 20px; + border: none; + background: transparent; +} +QComboBox::drop-down:hover { + background: rgba(0, 0, 0, 30); +} +QComboBox::down-arrow { + image: url(:/qss/icon/combo_arrow.png); + max-height:100%; + max-width:100%; +} +QComboBox::down-arrow:on { + top: 1px; +} +QComboBox QAbstractItemView { + border: 1px solid rgb(111, 156, 207); + background: white; + outline: none; +} +QComboBox QAbstractItemView::item { + height: 25px; + color: rgb(73, 73, 73); +} +QComboBox QAbstractItemView::item:selected { + background: rgb(232, 241, 250); + color: rgb(2, 65, 132); +} + +/**********进度条**********/ +QProgressBar{ + border: black; + text-align: center; + color: white; + background: rgb(173, 202, 232); +} +QProgressBar::chunk { + background: rgb(16, 135, 209); +} + +QProgressBar { + border: rgb(173, 202, 232); + text-align: center; + color: light; + background-color: transparent; + background-image: rgb(173, 202, 232); + background-repeat: repeat-x; +} +QProgressBar::chunk { + border: none; + background-color:rgb(173, 202, 232); + background-repeat: repeat-x; +} + +/**********复选框**********/ +QCheckBox{ + spacing: 5px; +} +QCheckBox:enabled:checked{ + color: rgb(2, 65, 132); +} +QCheckBox:enabled:!checked{ + color: rgb(70, 71, 73); +} +QCheckBox:enabled:hover{ + color: rgb(0, 78, 161); +} +QCheckBox:!enabled{ + color: rgb(80, 80, 80); +} +QCheckBox::indicator { + width: 20px; + height: 20px; +} +QCheckBox::indicator:unchecked { + image: url(:/qss/icon/checkbox.png); +} +QCheckBox::indicator:unchecked:hover { + image: url(:/qss/icon/checkbox_h.png); +} +QCheckBox::indicator:unchecked:pressed { + image: url(:/qss/icon/checkbox_p.png); +} +QCheckBox::indicator:checked { + image: url(:/qss/icon/check_box_p.png); +} +QCheckBox::indicator:checked:hover { + image: url(:/qss/icon/check_box_p.png); +} +QCheckBox::indicator:checked:pressed { + image: url(:/qss/icon/check_box_p.png); +} +QCheckBox::indicator:indeterminate { + image: url(:/qss/icon/check_box_p.png); +} +QCheckBox::indicator:indeterminate:hover { + image: url(:/qss/icon/check_box_p.png); +} +QCheckBox::indicator:indeterminate:pressed { + image: url(:/qss/icon/check_box_p.png); +} + +/**********单选框**********/ +QRadioButton{ + spacing: 5px; +} +QRadioButton:enabled:checked{ + color: rgb(2, 65, 132); +} +QRadioButton:enabled:!checked{ + color: rgb(70, 71, 73); +} +QRadioButton:enabled:hover{ + color: rgb(0, 78, 161); +} +QRadioButton:!enabled{ + color: rgb(80, 80, 80); +} +QRadioButton::indicator { + width: 20px; + height: 20px; +} +QRadioButton::indicator:unchecked { + image: url(:/White/radioButton); +} +QRadioButton::indicator:unchecked:hover { + image: url(:/White/radioButtonHover); +} +QRadioButton::indicator:unchecked:pressed { + image: url(:/White/radioButtonPressed); +} +QRadioButton::indicator:checked { + image: url(:/White/radioButtonChecked); +} +QRadioButton::indicator:checked:hover { + image: url(:/White/radioButtonCheckedHover); +} +QRadioButton::indicator:checked:pressed { + image: url(:/White/radioButtonCheckedPressed); +} + +/**********输入框**********/ +QLineEdit { + border-radius: 4px; + height: 25px; + border: 1px solid rgb(111, 156, 207); + background: white; +} +QLineEdit:enabled { + color: rgb(84, 84, 84); +} +QLineEdit:enabled:hover, QLineEdit:enabled:focus { + color: rgb(51, 51, 51); +} +QLineEdit:!enabled { + color: rgb(80, 80, 80); +} + +/**********文本编辑框**********/ +QTextEdit { + border: 1px solid rgb(111, 156, 207); + color: rgb(70, 71, 73); + background: rgb(187, 212, 238); +} + +/**********滚动区域**********/ +QScrollArea { + border: 1px solid rgb(111, 156, 207); + background: rgb(187, 212, 238); +} + +/**********滚动区域**********/ +QWidget#transparentWidget { + background: transparent; +} + +/**********微调器**********/ +QSpinBox { + border-radius: 4px; + height: 24px; + min-width: 40px; + border: 1px solid rgb(111, 156, 207); + background: white; +} +QSpinBox:enabled { + color: rgb(60, 60, 60); +} +QSpinBox:enabled:hover, QSpinBox:enabled:focus { + color: rgb(51, 51, 51); +} +QSpinBox:!enabled { + color: rgb(210, 210, 210); + background: transparent; +} +QSpinBox::up-button { + border-left: 1px solid rgb(111, 156, 207); + width: 18px; + height: 12px; + border-top-right-radius: 4px; + image: url(:/White/upButton); +} +QSpinBox::up-button:!enabled { + background: transparent; +} +QSpinBox::up-button:enabled:hover { + background: rgb(255, 255, 255, 30); +} +QSpinBox::down-button { + border-left: 1px solid rgb(111, 156, 207); + width: 18px; + height: 12px; + border-bottom-right-radius: 4px; + image: url(:/White/downButton); +} +QSpinBox::down-button:!enabled { + background: transparent; +} +QSpinBox::down-button:hover { + background: rgb(255, 255, 255, 30); +} +QLabel#label_3{ + font-size: 20px; + background-color: rgb(255, 255, 255, 30); + color : light; +} + +QDockWidget *{ +} +/**********标签**********/ +QLabel#grayLabel { + color: rgb(70, 71, 73); +} + +QLabel#highlightLabel { + color: rgb(2, 65, 132); +} + +QLabel#redLabel { + color: red; +} + +QLabel#grayYaHeiLabel { + color: rgb(175, 175, 175); + font-size: 15px; +} + +QLabel#blueLabel { + color: rgb(0, 160, 230); +} + +QLabel#listLabel { + color: rgb(51, 51, 51); +} + +QLabel#lineBlueLabel { + background: rgb(0, 78, 161); +} + +QLabel#graySeperateLabel { + background: rgb(200, 220, 230); +} + +QLabel#seperateLabel { + background: rgb(112, 153, 194); +} + +QLabel#radiusBlueLabel { + border-radius: 15px; + color: white; + font-size: 18px; + background: rgb(0, 78, 161); +} + +QLabel#skinLabel[colorProperty="normal"] { + color: rgb(56, 99, 154); +} +QLabel#skinLabel[colorProperty="highlight"] { + color: rgb(0, 160, 230); +} + +QLabel#informationLabel { + qproperty-pixmap: url(:/White/information); +} + +QLabel#errorLabel { + qproperty-pixmap: url(:/White/error); +} + +QLabel#successLabel { + qproperty-pixmap: url(:/White/success); +} + +QLabel#questionLabel { + qproperty-pixmap: url(:/White/question); +} + +QLabel#warningLabel { + qproperty-pixmap: url(:/White/warning); +} + +QLabel#groupLabel { + color: rgb(56, 99, 154); + border: 1px solid rgb(111, 156, 207); + font-size: 15px; + border-top-color: transparent; + border-right-color: transparent; + border-left-color: transparent; +} + +/**********按钮**********/ +QToolButton#nsccButton { + border: none; + color: rgb(2, 65, 132); + background: transparent; + padding: 10px; + qproperty-icon: url(:/White/nscc); + qproperty-iconSize: 32px 32px; + qproperty-toolButtonStyle: ToolButtonTextUnderIcon; +} +QToolButton#nsccButton:hover { + background: rgb(187, 212, 238); +} + +QToolButton#transferButton { + border: none; + color: rgb(2, 65, 132); + background: transparent; + padding: 10px; + qproperty-icon: url(:/White/transfer); + qproperty-iconSize: 32px 32px; + qproperty-toolButtonStyle: ToolButtonTextUnderIcon; +} + +QToolButton#transferButton:hover { + background: rgb(187, 212, 238); +} + +/**********按钮**********/ +QPushButton{ + border: none; /*去除边框*/ + font-size: 15px; +} + +QPushButton:enabled { + background: rgb(0, 78, 161); + color: white; +} + +QPushButton:!enabled { + background: rgb(180, 180, 180); + color: white; +} + +QPushButton:enabled:hover{ + background: rgb(100, 160, 220); +} + +QPushButton:enabled:pressed{ + background: rgb(120, 170, 220); +} diff --git a/qss/css/save_data_form.css b/qss/css/save_data_form.css new file mode 100644 index 0000000..d5ce63b --- /dev/null +++ b/qss/css/save_data_form.css @@ -0,0 +1,6 @@ +QWidget#save_data_form +{ + background: "white"; + border:1px solid black; +} + diff --git a/qss/css/vibration_comparison_form.css b/qss/css/vibration_comparison_form.css new file mode 100644 index 0000000..4a6cbd6 --- /dev/null +++ b/qss/css/vibration_comparison_form.css @@ -0,0 +1,46 @@ +QWidget#vibration_comparison_form +{ + border: 1px solid black; +} +QWidget#vibration_comparison_form QLabel#label +{ +} +QWidget#vibration_comparison_form QComboBox#comboBox +{ + border-radius:3px; +} +QWidget#vibration_comparison_form QComboBox#comboBox_2 +{ + border-radius:3px; +} +QWidget#vibration_comparison_form QLabel#label_2 +{ +} +QWidget#vibration_comparison_form QComboBox#comboBox_3 +{ + border-radius:3px; + +} +QWidget#vibration_comparison_form QComboBox#comboBox_4 +{ + border-radius:3px; +} +QWidget#vibration_comparison_form QPushButton#pushButton +{ + width: 24px; +} + +QWidget#vibration_comparison_form QPushButton#pushButton_2 +{ + width: 24px; + +} +QWidget#vibration_comparison_form QLabel#label_3 +{ +} +QWidget#vibration_comparison_form QRadioButton#radioButton +{ +} +QWidget#vibration_comparison_form QGraphicsView#graphicsView +{ +} diff --git a/qss/css/white.css b/qss/css/white.css new file mode 100644 index 0000000..847d018 --- /dev/null +++ b/qss/css/white.css @@ -0,0 +1,303 @@ +/* * The MIT License (MIT) * * Copyright : http://blog.csdn.net/liang19890820 * * Author : 一去丶二三里 * * Date : 2016/07/22 * * Description : 白色靓丽 * */ + +/**********子界面背景**********/ +QWidget#customWidget { background: rgb(173, 202, 232); } + +/**********子界面中央背景**********/ +QWidget#centerWidget { background: rgb(232, 241, 252); } + +/**********主界面样式**********/ +QWidget#mainWindow { border: 1px solid rgb(111, 156, 207); background: rgb(232, 241, 252); } + +QWidget#messageWidget { background: rgba(173, 202, 232, 50%); } + +QWidget#loadingWidget { border: none; border-radius: 5px; background: rgb(187, 212, 238); } + +QWidget#remoteWidget { border-top-right-radius: 10px; border-bottom-right-radius: 10px; border: 1px solid rgb(111, 156, 207); border-left: none; background: transparent; } + +StyledWidget { qproperty-normalColor: rgb(65, 65, 65); qproperty-disableColor: rgb(180, 180, 180); qproperty-highlightColor: rgb(0, 160, 230); qproperty-errorColor: red; } + +QProgressIndicator { qproperty-color: rgb(2, 65, 132); } + +/**********提示**********/ +QToolTip{ border: 1px solid rgb(111, 156, 207); background: white; color: rgb(51, 51, 51); } + +/**********菜单栏**********/ +QMenuBar { background: rgb(187, 212, 238); border: 1px solid rgb(111, 156, 207); border-left: none; border-right: none; } +QMenuBar::item { border: 1px solid transparent; padding: 5px 10px 5px 10px; background: transparent; } +QMenuBar::item:enabled { color: rgb(2, 65, 132); } +QMenuBar::item:!enabled { color: rgb(155, 155, 155); } +QMenuBar::item:enabled:selected { border-top-color: rgb(111, 156, 207); border-bottom-color: rgb(111, 156, 207); background: rgb(198, 224, 252); } + +/**********菜单**********/ +QMenu { border: 1px solid rgb(111, 156, 207); background: rgb(232, 241, 250); } +QMenu::item { height: 22px; padding: 0px 25px 0px 20px; } +QMenu::item:enabled { color: rgb(84, 84, 84); } +QMenu::item:!enabled { color: rgb(155, 155, 155); } +QMenu::item:enabled:selected { color: rgb(2, 65, 132); background: rgba(255, 255, 255, 200); } +QMenu::separator { height: 1px; background: rgb(111, 156, 207); } +QMenu::indicator { width: 13px; height: 13px; } +QMenu::icon { padding-left: 2px; padding-right: 2px; } + +/**********状态栏**********/ +QStatusBar { background: rgb(187, 212, 238); border: 1px solid rgb(111, 156, 207); border-left: none; border-right: none; border-bottom: none; } +QStatusBar::item { border: none; border-right: 1px solid rgb(111, 156, 207); } + +/**********分组框**********/ +QGroupBox { font-size: 15px; border: 1px solid rgb(111, 156, 207); border-radius: 4px; margin-top: 10px; } +QGroupBox::title { color: rgb(56, 99, 154); top: -12px; left: 10px; } + +/**********页签项**********/ +QTabWidget::pane { border: none; border-top: 3px solid rgb(0, 78, 161); background: rgb(187, 212, 238); } +QTabWidget::tab-bar { border: none; } +QTabBar::tab { border: none; border-top-left-radius: 4px; border-top-right-radius: 4px; color: white; background: rgb(120, 170, 220); height: 28px; min-width: 85px; margin-right: 5px; padding-left: 5px; padding-right: 5px; } +QTabBar::tab:hover { background: rgb(0, 78, 161); } +QTabBar::tab:selected { color: white; background: rgb(0, 78, 161); } + +QTabWidget#tabWidget::pane { border: 1px solid rgb(111, 156, 207); background: rgb(232, 241, 252); margin-top: -1px; } + +QTabBar#tabBar::tab { border: 1px solid rgb(111, 156, 207); border-bottom: none; color: rgb(70, 71, 73); background: transparent; } +QTabBar#tabBar::tab:hover { color: rgb(2, 65, 132); } +QTabBar#tabBar::tab:selected { color: rgb(2, 65, 132); background: rgb(232, 241, 252); } + +/**********表头**********/ +QHeaderView{ border: none; border-bottom: 3px solid rgb(0, 78, 161); background: transparent; min-height: 30px; } +QHeaderView::section:horizontal { border: none; color: rgb(2, 65, 132); background: transparent; padding-left: 5px; } +QHeaderView::section:horizontal:hover { color: white; background: rgb(0, 78, 161); } +QHeaderView::section:horizontal:pressed { color: white; background: rgb(6, 94, 187); } +QHeaderView::up-arrow { width: 13px; height: 11px; padding-right: 5px; image: url(:/White/topArrow); subcontrol-position: center right; } +QHeaderView::up-arrow:hover, QHeaderView::up-arrow:pressed { image: url(:/White/topArrowHover); } +QHeaderView::down-arrow { width: 13px; height: 11px; padding-right: 5px; image: url(:/White/bottomArrow); subcontrol-position: center right; } +QHeaderView::down-arrow:hover, QHeaderView::down-arrow:pressed { image: url(:/White/bottomArrowHover); } + +/**********表格**********/ +QTableView { border: 1px solid rgb(111, 156, 207); background: rgb(224, 238, 255); gridline-color: rgb(111, 156, 207); } +QTableView::item { padding-left: 5px; padding-right: 5px; border: none; background: white; border-right: 1px solid rgb(111, 156, 207); border-bottom: 1px solid rgb(111, 156, 207); } +QTableView::item:selected { background: rgba(255, 255, 255, 100); } +QTableView::item:selected:!active { color: rgb(65, 65, 65); } +QTableView::indicator { width: 20px; height: 20px; } +QTableView::indicator:enabled:unchecked { image: url(:/White/checkBox); } +QTableView::indicator:enabled:unchecked:hover { image: url(:/White/checkBoxHover); } +QTableView::indicator:enabled:unchecked:pressed { image: url(:/White/checkBoxPressed); } +QTableView::indicator:enabled:checked { image: url(:/White/checkBoxChecked); } +QTableView::indicator:enabled:checked:hover { image: url(:/White/checkBoxCheckedHover); } +QTableView::indicator:enabled:checked:pressed { image: url(:/White/checkBoxCheckedPressed); } +QTableView::indicator:enabled:indeterminate { image: url(:/White/checkBoxIndeterminate); } +QTableView::indicator:enabled:indeterminate:hover { image: url(:/White/checkBoxIndeterminateHover); } +QTableView::indicator:enabled:indeterminate:pressed { image: url(:/White/checkBoxIndeterminatePressed); } + +/**********滚动条-水平**********/ +QScrollBar:horizontal { height: 20px; background: transparent; margin-top: 3px; margin-bottom: 3px; } +QScrollBar::handle:horizontal { height: 20px; min-width: 30px; background: rgb(170, 200, 230); margin-left: 15px; margin-right: 15px; } +QScrollBar::handle:horizontal:hover { background: rgb(165, 195, 225); } +QScrollBar::sub-line:horizontal { width: 15px; background: transparent; image: url(:/White/arrowLeft); subcontrol-position: left; } +QScrollBar::add-line:horizontal { width: 15px; background: transparent; image: url(:/White/arrowRight); subcontrol-position: right; } +QScrollBar::sub-line:horizontal:hover { background: rgb(170, 200, 230); } +QScrollBar::add-line:horizontal:hover { background: rgb(170, 200, 230); } +QScrollBar::add-page:horizontal,QScrollBar::sub-page:horizontal { background: transparent; } + +/**********滚动条-垂直**********/ +QScrollBar:vertical { width: 20px; background: transparent; margin-left: 3px; margin-right: 3px; } +QScrollBar::handle:vertical { width: 20px; min-height: 30px; background: rgb(170, 200, 230); margin-top: 15px; margin-bottom: 15px; } +QScrollBar::handle:vertical:hover { background: rgb(165, 195, 225); } +QScrollBar::sub-line:vertical { height: 15px; background: transparent; image: url(:/White/topArrow); subcontrol-position: top; } +QScrollBar::add-line:vertical { height: 15px; background: transparent; image: url(:/White/bottomArrow); subcontrol-position: bottom; } +QScrollBar::sub-line:vertical:hover { background: rgb(170, 200, 230); } +QScrollBar::add-line:vertical:hover { background: rgb(170, 200, 230); } +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } + +QScrollBar#verticalScrollBar:vertical { margin-top: 30px; } + +/**********下拉列表**********/ +QComboBox { height: 25px; border-radius: 4px; border: 1px solid rgb(111, 156, 207); background: white; } +QComboBox:enabled { color: rgb(84, 84, 84); } +QComboBox:!enabled { color: rgb(80, 80, 80); } +QComboBox:enabled:hover, QComboBox:enabled:focus { color: rgb(51, 51, 51); } +QComboBox::drop-down { width: 20px; border: none; background: transparent; } +QComboBox::drop-down:hover { background: rgba(255, 255, 255, 30); } +QComboBox::down-arrow { image: url(:/White/arrowBottom); } +QComboBox::down-arrow:on { /**top: 1px;**/ } +QComboBox QAbstractItemView { border: 1px solid rgb(111, 156, 207); background: white; outline: none; } +QComboBox QAbstractItemView::item { height: 25px; color: rgb(73, 73, 73); } +QComboBox QAbstractItemView::item:selected { background: rgb(232, 241, 250); color: rgb(2, 65, 132); } + +/**********进度条**********/ +QProgressBar{ border: none; text-align: center; color: white; background: rgb(173, 202, 232); } +QProgressBar::chunk { background: rgb(16, 135, 209); } + +QProgressBar#progressBar { border: none; text-align: center; color: white; background-color: transparent; background-image: url(":/White/progressBar"); background-repeat: repeat-x; } +QProgressBar#progressBar::chunk { border: none; background-color: transparent; background-image: url(":/White/progressBarChunk"); background-repeat: repeat-x; } + +/**********复选框**********/ +QCheckBox{ spacing: 5px; } +QCheckBox:enabled:checked{ color: rgb(2, 65, 132); } +QCheckBox:enabled:!checked{ color: rgb(70, 71, 73); } +QCheckBox:enabled:hover{ color: rgb(0, 78, 161); } +QCheckBox:!enabled{ color: rgb(80, 80, 80); } +QCheckBox::indicator { width: 20px; height: 20px; } +QCheckBox::indicator:unchecked { image: url(:/White/checkBox); } +QCheckBox::indicator:unchecked:hover { image: url(:/White/checkBoxHover); } +QCheckBox::indicator:unchecked:pressed { image: url(:/White/checkBoxPressed); } +QCheckBox::indicator:checked { image: url(:/White/checkBoxChecked); } +QCheckBox::indicator:checked:hover { image: url(:/White/checkBoxCheckedHover); } +QCheckBox::indicator:checked:pressed { image: url(:/White/checkBoxCheckedPressed); } +QCheckBox::indicator:indeterminate { image: url(:/White/checkBoxIndeterminate); } +QCheckBox::indicator:indeterminate:hover { image: url(:/White/checkBoxIndeterminateHover); } +QCheckBox::indicator:indeterminate:pressed { image: url(:/White/checkBoxIndeterminatePressed); } + +/**********单选框**********/ +QRadioButton{ spacing: 5px; } +QRadioButton:enabled:checked{ color: rgb(2, 65, 132); } +QRadioButton:enabled:!checked{ color: rgb(70, 71, 73); } +QRadioButton:enabled:hover{ color: rgb(0, 78, 161); } +QRadioButton:!enabled{ color: rgb(80, 80, 80); } +QRadioButton::indicator { width: 20px; height: 20px; } +QRadioButton::indicator:unchecked { image: url(:/White/radioButton); } +QRadioButton::indicator:unchecked:hover { image: url(:/White/radioButtonHover); } +QRadioButton::indicator:unchecked:pressed { image: url(:/White/radioButtonPressed); } +QRadioButton::indicator:checked { image: url(:/White/radioButtonChecked); } +QRadioButton::indicator:checked:hover { image: url(:/White/radioButtonCheckedHover); } +QRadioButton::indicator:checked:pressed { image: url(:/White/radioButtonCheckedPressed); } + +/**********输入框**********/ +QLineEdit { border-radius: 4px; height: 25px; border: 1px solid rgb(111, 156, 207); background: white; } +QLineEdit:enabled { color: rgb(84, 84, 84); } +QLineEdit:enabled:hover, QLineEdit:enabled:focus { color: rgb(51, 51, 51); } +QLineEdit:!enabled { color: rgb(80, 80, 80); } + +/**********文本编辑框**********/ +QTextEdit { border: 1px solid rgb(111, 156, 207); color: rgb(70, 71, 73); background: rgb(187, 212, 238); } + +/**********滚动区域**********/ +QScrollArea { border: 1px solid rgb(111, 156, 207); background: rgb(187, 212, 238); } + +/**********滚动区域**********/ +QWidget#transparentWidget { background: transparent; } + +/**********微调器**********/ +QSpinBox { border-radius: 4px; height: 24px; min-width: 40px; border: 1px solid rgb(111, 156, 207); background: white; } +QSpinBox:enabled { color: rgb(60, 60, 60); } +QSpinBox:enabled:hover, QSpinBox:enabled:focus { color: rgb(51, 51, 51); } +QSpinBox:!enabled { color: rgb(210, 210, 210); background: transparent; } +QSpinBox::up-button { border-left: 1px solid rgb(111, 156, 207); width: 18px; height: 12px; border-top-right-radius: 4px; image: url(:/White/upButton); } +QSpinBox::up-button:!enabled { background: transparent; } +QSpinBox::up-button:enabled:hover { background: rgb(255, 255, 255, 30); } +QSpinBox::down-button { border-left: 1px solid rgb(111, 156, 207); width: 18px; height: 12px; border-bottom-right-radius: 4px; image: url(:/White/downButton); } +QSpinBox::down-button:!enabled { background: transparent; } +QSpinBox::down-button:hover { background: rgb(255, 255, 255, 30); } + +/**********标签**********/ +QLabel#grayLabel { color: rgb(70, 71, 73); } + +QLabel#highlightLabel { color: rgb(2, 65, 132); } + +QLabel#redLabel { color: red; } + +QLabel#grayYaHeiLabel { color: rgb(175, 175, 175); font-size: 16px; } + +QLabel#blueLabel { color: rgb(0, 160, 230); } + +QLabel#listLabel { color: rgb(51, 51, 51); } + +QLabel#lineBlueLabel { background: rgb(0, 78, 161); } + +QLabel#graySeperateLabel { background: rgb(200, 220, 230); } + +QLabel#seperateLabel { background: rgb(112, 153, 194); } + +QLabel#radiusBlueLabel { border-radius: 15px; color: white; font-size: 16px; background: rgb(0, 78, 161); } + +QLabel#skinLabel[colorProperty="normal"] { color: rgb(56, 99, 154); } +QLabel#skinLabel[colorProperty="highlight"] { color: rgb(0, 160, 230); } + +QLabel#informationLabel { qproperty-pixmap: url(:/White/information); } + +QLabel#errorLabel { qproperty-pixmap: url(:/White/error); } + +QLabel#successLabel { qproperty-pixmap: url(:/White/success); } + +QLabel#questionLabel { qproperty-pixmap: url(:/White/question); } + +QLabel#warningLabel { qproperty-pixmap: url(:/White/warning); } + +QLabel#groupLabel { color: rgb(56, 99, 154); border: 1px solid rgb(111, 156, 207); font-size: 15px; border-top-color: transparent; border-right-color: transparent; border-left-color: transparent; } + +/**********按钮**********/ +QToolButton#nsccButton { border: none; color: rgb(2, 65, 132); background: transparent; padding: 10px; qproperty-icon: url(:/White/nscc); qproperty-iconSize: 32px 32px; qproperty-toolButtonStyle: ToolButtonTextUnderIcon; } +QToolButton#nsccButton:hover { background: rgb(187, 212, 238); } + +QToolButton#transferButton { border: none; color: rgb(2, 65, 132); background: transparent; padding: 10px; qproperty-icon: url(:/White/transfer); qproperty-iconSize: 32px 32px; qproperty-toolButtonStyle: ToolButtonTextUnderIcon; } +QToolButton#transferButton:hover { background: rgb(187, 212, 238); } + +/**********按钮**********/ +QPushButton{ border-radius: 4px; border: none; width: 75px; height: 25px; } +QPushButton:enabled { background: rgb(120, 170, 220); color: white; } +QPushButton:!enabled { background: rgb(180, 180, 180); color: white; } +QPushButton:enabled:hover{ background: rgb(100, 160, 220); } +QPushButton:enabled:pressed{ background: rgb(0, 78, 161); } + +QPushButton#blueButton { color: white; } +QPushButton#blueButton:enabled { background: rgb(0, 78, 161); color: white; } +QPushButton:!enabled { background: rgb(180, 180, 180); color: white; } +QPushButton#blueButton:enabled:hover { background: rgb(2, 65, 132); } +QPushButton#blueButton:enabled:pressed { background: rgb(6, 94, 187); } + +QPushButton#selectButton { border: none; border-radius: none; border-left: 1px solid rgb(111, 156, 207); background: transparent; image: url(:/White/scan); color: rgb(51, 51, 51); } +QPushButton#selectButton:enabled:hover{ background: rgb(187, 212, 238); } +QPushButton#selectButton:enabled:pressed{ background: rgb(120, 170, 220); } + +QPushButton#linkButton { background: transparent; color: rgb(0, 160, 230); text-align:left; } +QPushButton#linkButton:hover { color: rgb(20, 185, 255); text-decoration: underline; } +QPushButton#linkButton:pressed { color: rgb(0, 160, 230); } + +QPushButton#transparentButton { background: transparent; } + +/*****************标题栏按钮*******************/ +QPushButton#minimizeButton { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/minimizeHover); } +QPushButton#minimizeButton:hover { image: url(:/White/minimize); } +QPushButton#minimizeButton:pressed { image: url(:/White/minimizePressed); } + +QPushButton#maximizeButton[maximizeProperty="maximize"] { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/maximizeHover); } +QPushButton#maximizeButton[maximizeProperty="maximize"]:hover { image: url(:/White/maximize); } +QPushButton#maximizeButton[maximizeProperty="maximize"]:pressed { image: url(:/White/maximizePressed); } + +QPushButton#maximizeButton[maximizeProperty="restore"] { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/restoreHover); } +QPushButton#maximizeButton[maximizeProperty="restore"]:hover { image: url(:/White/restore); } +QPushButton#maximizeButton[maximizeProperty="restore"]:pressed { image: url(:/White/restorePressed); } + +QPushButton#closeButton { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/closeHover); } +QPushButton#closeButton:hover { image: url(:/White/close); } +QPushButton#closeButton:pressed { image: url(:/White/closePressed); } + +QPushButton#skinButton { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/skinHover); } +QPushButton#skinButton:hover { image: url(:/White/skin); } +QPushButton#skinButton:pressed { image: url(:/White/skinPressed); } + +QPushButton#feedbackButton { border-radius: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; background: rgb(120, 170, 220); image: url(:/White/feedbackHover); } +QPushButton#feedbackButton:hover { image: url(:/White/feedback); } +QPushButton#feedbackButton:pressed { image: url(:/White/feedbackPressed); } + +QPushButton#closeTipButton { border-radius: none; border-image: url(:/White/close); background: transparent; } +QPushButton#closeTipButton:hover { border-image: url(:/White/closeHover); } +QPushButton#closeTipButton:pressed { border-image: url(:/White/closePressed); } + +QPushButton#changeSkinButton{ border-radius: 4px; border: 2px solid rgb(111, 156, 207); background: rgb(204, 227, 252); } +QPushButton#changeSkinButton:hover{ border-color: rgb(60, 150, 200); } +QPushButton#changeSkinButton:pressed, QPushButton#changeSkinButton:checked{ border-color: rgb(0, 160, 230); } + +QPushButton#transferButton { padding-left: 5px; padding-right: 5px; color: white; background: rgb(0, 78, 161); } +QPushButton#transferButton:hover { background: rgb(2, 65, 132); } +QPushButton#transferButton:pressed { background: rgb(6, 94, 187); } +QPushButton#transferButton[iconProperty="left"] { qproperty-icon: url(:/White/left); } +QPushButton#transferButton[iconProperty="right"] { qproperty-icon: url(:/White/right); } + +QPushButton#openButton { border-radius: none; image: url(:/White/open); background: transparent; } +QPushButton#openButton:hover { image: url(:/White/openHover); } +QPushButton#openButton:pressed { image: url(:/White/openPressed); } + +QPushButton#deleteButton { border-radius: none; image: url(:/White/delete); background: transparent; } +QPushButton#deleteButton:hover { image: url(:/White/deleteHover); } +QPushButton#deleteButton:pressed { image: url(:/White/deletePressed); } + +QPushButton#menuButton { text-align: left center; padding-left: 3px; color: rgb(84, 84, 84); border: 1px solid rgb(111, 156, 207); background: white; } +QPushButton#menuButton::menu-indicator{ subcontrol-position: right center; subcontrol-origin: padding; image: url(:/White/arrowBottom); padding-right: 3px; } diff --git a/qss/icon/1-最大化.svg b/qss/icon/1-最大化.svg new file mode 100644 index 0000000..b704561 --- /dev/null +++ b/qss/icon/1-最大化.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/Thumbs.db b/qss/icon/Thumbs.db new file mode 100644 index 0000000..fb49600 Binary files /dev/null and b/qss/icon/Thumbs.db differ diff --git a/qss/icon/action_config.png b/qss/icon/action_config.png new file mode 100644 index 0000000..f7e64b6 Binary files /dev/null and b/qss/icon/action_config.png differ diff --git a/qss/icon/array.svg b/qss/icon/array.svg new file mode 100644 index 0000000..7ae234d --- /dev/null +++ b/qss/icon/array.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/boolean.svg b/qss/icon/boolean.svg new file mode 100644 index 0000000..6592ee0 --- /dev/null +++ b/qss/icon/boolean.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/btn_close_down.png b/qss/icon/btn_close_down.png new file mode 100644 index 0000000..814cdc7 Binary files /dev/null and b/qss/icon/btn_close_down.png differ diff --git a/qss/icon/btn_close_down.svg b/qss/icon/btn_close_down.svg new file mode 100644 index 0000000..095ee89 --- /dev/null +++ b/qss/icon/btn_close_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/btn_close_highlight.png b/qss/icon/btn_close_highlight.png new file mode 100644 index 0000000..2bc66bb Binary files /dev/null and b/qss/icon/btn_close_highlight.png differ diff --git a/qss/icon/btn_close_normal.png b/qss/icon/btn_close_normal.png new file mode 100644 index 0000000..11c1f52 Binary files /dev/null and b/qss/icon/btn_close_normal.png differ diff --git a/qss/icon/btn_data.png b/qss/icon/btn_data.png new file mode 100644 index 0000000..61329e1 Binary files /dev/null and b/qss/icon/btn_data.png differ diff --git a/qss/icon/btn_max_down.png b/qss/icon/btn_max_down.png new file mode 100644 index 0000000..ab159f8 Binary files /dev/null and b/qss/icon/btn_max_down.png differ diff --git a/qss/icon/btn_max_highlight.png b/qss/icon/btn_max_highlight.png new file mode 100644 index 0000000..f9a2a1b Binary files /dev/null and b/qss/icon/btn_max_highlight.png differ diff --git a/qss/icon/btn_max_normal.png b/qss/icon/btn_max_normal.png new file mode 100644 index 0000000..cb065af Binary files /dev/null and b/qss/icon/btn_max_normal.png differ diff --git a/qss/icon/btn_max_normal.svg b/qss/icon/btn_max_normal.svg new file mode 100644 index 0000000..daacc05 --- /dev/null +++ b/qss/icon/btn_max_normal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/btn_mini_down.png b/qss/icon/btn_mini_down.png new file mode 100644 index 0000000..d7a579a Binary files /dev/null and b/qss/icon/btn_mini_down.png differ diff --git a/qss/icon/btn_mini_down.svg b/qss/icon/btn_mini_down.svg new file mode 100644 index 0000000..4ae753b --- /dev/null +++ b/qss/icon/btn_mini_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/btn_mini_highlight.png b/qss/icon/btn_mini_highlight.png new file mode 100644 index 0000000..71b6020 Binary files /dev/null and b/qss/icon/btn_mini_highlight.png differ diff --git a/qss/icon/btn_mini_normal.png b/qss/icon/btn_mini_normal.png new file mode 100644 index 0000000..644727a Binary files /dev/null and b/qss/icon/btn_mini_normal.png differ diff --git a/qss/icon/btn_restore_down.png b/qss/icon/btn_restore_down.png new file mode 100644 index 0000000..67b4705 Binary files /dev/null and b/qss/icon/btn_restore_down.png differ diff --git a/qss/icon/btn_restore_down.svg b/qss/icon/btn_restore_down.svg new file mode 100644 index 0000000..04bc9e2 --- /dev/null +++ b/qss/icon/btn_restore_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/btn_restore_highlight.png b/qss/icon/btn_restore_highlight.png new file mode 100644 index 0000000..f57eb81 Binary files /dev/null and b/qss/icon/btn_restore_highlight.png differ diff --git a/qss/icon/btn_restore_normal.png b/qss/icon/btn_restore_normal.png new file mode 100644 index 0000000..e53f9c1 Binary files /dev/null and b/qss/icon/btn_restore_normal.png differ diff --git a/qss/icon/btn_serial.png b/qss/icon/btn_serial.png new file mode 100644 index 0000000..8543aa8 Binary files /dev/null and b/qss/icon/btn_serial.png differ diff --git a/qss/icon/charts.png b/qss/icon/charts.png new file mode 100644 index 0000000..ddb2e5b Binary files /dev/null and b/qss/icon/charts.png differ diff --git a/qss/icon/check_box_p.png b/qss/icon/check_box_p.png new file mode 100644 index 0000000..33c8d49 Binary files /dev/null and b/qss/icon/check_box_p.png differ diff --git a/qss/icon/checkbox.png b/qss/icon/checkbox.png new file mode 100644 index 0000000..2c56aa4 Binary files /dev/null and b/qss/icon/checkbox.png differ diff --git a/qss/icon/checkbox_h.png b/qss/icon/checkbox_h.png new file mode 100644 index 0000000..3d89dc3 Binary files /dev/null and b/qss/icon/checkbox_h.png differ diff --git a/qss/icon/checkbox_p.png b/qss/icon/checkbox_p.png new file mode 100644 index 0000000..8f8d37b Binary files /dev/null and b/qss/icon/checkbox_p.png differ diff --git a/qss/icon/close_main.png b/qss/icon/close_main.png new file mode 100644 index 0000000..3356428 Binary files /dev/null and b/qss/icon/close_main.png differ diff --git a/qss/icon/code-array.svg b/qss/icon/code-array.svg new file mode 100644 index 0000000..0434557 --- /dev/null +++ b/qss/icon/code-array.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/combo_arrow.png b/qss/icon/combo_arrow.png new file mode 100644 index 0000000..a054bcd Binary files /dev/null and b/qss/icon/combo_arrow.png differ diff --git a/qss/icon/dataflow.svg b/qss/icon/dataflow.svg new file mode 100644 index 0000000..0c69265 --- /dev/null +++ b/qss/icon/dataflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/downarrow.png b/qss/icon/downarrow.png new file mode 100644 index 0000000..b810e44 Binary files /dev/null and b/qss/icon/downarrow.png differ diff --git a/qss/icon/hor_scroll_left_arrow.png b/qss/icon/hor_scroll_left_arrow.png new file mode 100644 index 0000000..1093f6e Binary files /dev/null and b/qss/icon/hor_scroll_left_arrow.png differ diff --git a/qss/icon/hor_scroll_right_arrow.png b/qss/icon/hor_scroll_right_arrow.png new file mode 100644 index 0000000..cc3bf17 Binary files /dev/null and b/qss/icon/hor_scroll_right_arrow.png differ diff --git a/qss/icon/int.png b/qss/icon/int.png new file mode 100644 index 0000000..1052220 Binary files /dev/null and b/qss/icon/int.png differ diff --git a/qss/icon/int.svg b/qss/icon/int.svg new file mode 100644 index 0000000..9ce427c --- /dev/null +++ b/qss/icon/int.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/key.svg b/qss/icon/key.svg new file mode 100644 index 0000000..cda69f7 --- /dev/null +++ b/qss/icon/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/logo.png b/qss/icon/logo.png new file mode 100644 index 0000000..5fbeb2a Binary files /dev/null and b/qss/icon/logo.png differ diff --git a/qss/icon/missing.svg b/qss/icon/missing.svg new file mode 100644 index 0000000..fba40ff --- /dev/null +++ b/qss/icon/missing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/objects.svg b/qss/icon/objects.svg new file mode 100644 index 0000000..2f33712 --- /dev/null +++ b/qss/icon/objects.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/radio.png b/qss/icon/radio.png new file mode 100644 index 0000000..8c32808 Binary files /dev/null and b/qss/icon/radio.png differ diff --git a/qss/icon/radio_h.png b/qss/icon/radio_h.png new file mode 100644 index 0000000..84407ba Binary files /dev/null and b/qss/icon/radio_h.png differ diff --git a/qss/icon/radio_p.png b/qss/icon/radio_p.png new file mode 100644 index 0000000..4f32d5e Binary files /dev/null and b/qss/icon/radio_p.png differ diff --git a/qss/icon/sizegrip.png b/qss/icon/sizegrip.png new file mode 100644 index 0000000..f2667b9 Binary files /dev/null and b/qss/icon/sizegrip.png differ diff --git a/qss/icon/string.svg b/qss/icon/string.svg new file mode 100644 index 0000000..924a541 --- /dev/null +++ b/qss/icon/string.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/ver_scroll_bottom_arrow.png b/qss/icon/ver_scroll_bottom_arrow.png new file mode 100644 index 0000000..2be161f Binary files /dev/null and b/qss/icon/ver_scroll_bottom_arrow.png differ diff --git a/qss/icon/ver_scroll_top_arrow.png b/qss/icon/ver_scroll_top_arrow.png new file mode 100644 index 0000000..a8e4fed Binary files /dev/null and b/qss/icon/ver_scroll_top_arrow.png differ diff --git a/qss/icon/关闭.svg b/qss/icon/关闭.svg new file mode 100644 index 0000000..90e1a95 --- /dev/null +++ b/qss/icon/关闭.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/icon/最小化.svg b/qss/icon/最小化.svg new file mode 100644 index 0000000..171b4f6 --- /dev/null +++ b/qss/icon/最小化.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qss/qss.qrc b/qss/qss.qrc new file mode 100644 index 0000000..5792182 --- /dev/null +++ b/qss/qss.qrc @@ -0,0 +1,56 @@ + + + icon/btn_close_down.png + icon/btn_close_highlight.png + icon/btn_close_normal.png + icon/btn_max_down.png + icon/btn_max_highlight.png + icon/btn_max_normal.png + icon/btn_mini_down.png + icon/btn_mini_highlight.png + icon/btn_mini_normal.png + icon/btn_restore_down.png + icon/btn_restore_highlight.png + icon/btn_restore_normal.png + icon/checkbox.png + icon/checkbox_h.png + icon/checkbox_p.png + icon/downarrow.png + icon/hor_scroll_left_arrow.png + icon/hor_scroll_right_arrow.png + icon/radio.png + icon/radio_h.png + icon/radio_p.png + icon/ver_scroll_bottom_arrow.png + icon/ver_scroll_top_arrow.png + icon/sizegrip.png + css/qss.css + icon/btn_serial.png + css/white.css + css/dark.css + icon/btn_data.png + icon/dataflow.svg + icon/check_box_p.png + icon/combo_arrow.png + icon/charts.png + icon/btn_max_normal.svg + icon/btn_restore_down.svg + icon/btn_mini_down.svg + icon/btn_close_down.svg + icon/close_main.png + icon/logo.png + icon/key.svg + icon/action_config.png + icon/int.svg + icon/objects.svg + icon/string.svg + icon/missing.svg + css/QssMainWindow.css + css/QssTitleBar.css + css/corrugation_form.css + css/vibration_comparison_form.css + css/mainwindow.css + css/basic.css + css/save_data_form.css + + diff --git a/yuvgl.pro b/yuvgl.pro index 5b2c6f8..4213e3f 100644 --- a/yuvgl.pro +++ b/yuvgl.pro @@ -136,3 +136,6 @@ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target +RESOURCES += \ + qss/qss.qrc + diff --git a/yuvgl.pro.user b/yuvgl.pro.user index 2795ca8..28f616f 100644 --- a/yuvgl.pro.user +++ b/yuvgl.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId