TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
qkugouwindow.cpp
Go to the documentation of this file.
1 #include "qkugouwindow.h"
2 #include "qkugouuiobject.h"
3 
4 #ifdef Q_OS_WIN
5 # include <ActiveQt/QAxWidget>
6 #else
7 # ifdef TTK_WEBKIT
8 # if TTK_QT_VERSION_CHECK(5,0,0)
9 # include <QtWebKitWidgets/QWebView>
10 # include <QtWebKitWidgets/QWebFrame>
11 # else
12 # include <QtWebKit/QWebView>
13 # include <QtWebKit/QWebFrame>
14 # endif
15 # elif defined TTK_WEBENGINE
16 # include <QtWebEngineWidgets/QWebEngineView>
17 # include <QtWebEngineWidgets/QWebEngineSettings>
18 # endif
19 #endif
20 
21 #include <QLabel>
22 #include <QTimer>
23 #include <QBoxLayout>
24 #include <QPushButton>
25 #include <QButtonGroup>
26 
30 class QKugouWindowPrivate : public TTKPrivate<QKugouWindow>
31 {
32 public:
35 
36  QWidget *m_webView, *m_topWidget;
37  QButtonGroup *m_buttonGroup;
38 };
39 
41  : m_webView(nullptr),
42  m_topWidget(nullptr),
43  m_buttonGroup(nullptr)
44 {
45 
46 }
47 
49 {
50  delete m_buttonGroup;
51  delete m_topWidget;
52  delete m_webView;
53 }
54 
55 
56 
57 QKugouWindow::QKugouWindow(Module type, QWidget *parent)
58  : QWidget(parent)
59 {
61 
62 #ifdef Q_OS_UNIX
63 # ifdef TTK_WEBKIT
64  QWebSettings *settings = QWebSettings::globalSettings();
65  settings->setAttribute(QWebSettings::PluginsEnabled, true);
66  settings->setAttribute(QWebSettings::JavascriptEnabled, true);
67  settings->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
68  settings->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
69 # elif defined TTK_WEBENGINE
70  QWebEngineSettings *settings = QWebEngineSettings::defaultSettings();
71  settings->setAttribute(QWebEngineSettings::PluginsEnabled, true);
72  settings->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
73  settings->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
74 # endif
75 #endif
76 
77  switch(type)
78  {
79  case KuGouSong: createKugouSongWidget(); break;
80  case KuGouRadio: createKugouRadioWidget(); break;
81  case KuGouList: createKugouListWidget(); break;
82  case KugouMovie: createKugouMovieWidget(); break;
83  case KuGouSingle: createKugouSingleWidget(); break;
84  default: break;
85  }
86 }
87 
88 void QKugouWindow::setUrl(const QString &url)
89 {
91 #ifdef Q_OS_WIN
92  QAxWidget *w = TTKObjectCast(QAxWidget*, d->m_webView);
93  if(w)
94  {
95  w->dynamicCall("Navigate(const QString&)", url);
96  }
97 #else
98 # ifdef TTK_WEBKIT
99  QWebView *w = TTKObjectCast(QWebView*, d->m_webView);
100  if(w)
101  {
102  w->setUrl(url);
103  }
104 # elif defined TTK_WEBENGINE
105  QWebEngineView *w = TTKObjectCast(QWebEngineView*, d->m_webView);
106  if(w)
107  {
108  w->setUrl(url);
109  }
110 # else
111  Q_UNUSED(url);
112  Q_UNUSED(d);
113 # endif
114 #endif
115 }
116 
118 {
120 #ifdef Q_OS_WIN
121  TTK_SIGNLE_SHOT(TTKObjectCast(QAxWidget*, d->m_webView), Refresh, TTK_SLOT);
122 #else
123 # ifdef TTK_WEBKIT
124  QWebView *w = TTKObjectCast(QWebView*, d->m_webView);
125  if(w)
126  {
127  w->reload();
128  }
129 # elif defined TTK_WEBENGINE
130  QWebEngineView *w = TTKObjectCast(QWebEngineView*, d->m_webView);
131  if(w)
132  {
133  w->reload();
134  }
135 # else
136  Q_UNUSED(d);
137 # endif
138 #endif
139 }
140 
142 {
144  QString url = QKugouUrl::makeSongRecommendUrl();
145  switch(index)
146  {
147  case 0: url = QKugouUrl::makeSongRecommendUrl(); break;
148  case 1: url = QKugouUrl::makeSongRankUrl(); break;
149  case 2: url = QKugouUrl::makeSongSingerUrl(); break;
150  case 3: url = QKugouUrl::makeSongCategoryUrl(); break;
151  default: break;
152  }
153 
154  setUrl(url);
155 }
156 
158 {
160  QString url = QKugouUrl::makeRadioPublicUrl();
161  switch(index)
162  {
163  case 0: url = QKugouUrl::makeRadioPublicUrl(); break;
164  case 1: url = QKugouUrl::makeRadioHighFmUrl(); break;
165  default: break;
166  }
167 
168  setUrl(url);
169 }
170 
172 {
174  QString url = QKugouUrl::makeMVRadioUrl();
175  switch(index)
176  {
177  case 0: url = QKugouUrl::makeMVRadioUrl(); break;
178  case 1: url = QKugouUrl::makeMVRecommendUrl(); break;
179  default: break;
180  }
181 
182  setUrl(url);
183 }
184 
186 {
188  delete d->m_webView;
189 #ifdef Q_OS_WIN
190  QAxWidget *view = new QAxWidget(this);
191  view->setWindowFlags(Qt::FramelessWindowHint);
192  view->setMouseTracking(false);
193  view->setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}"); //ie web view
194  view->setObjectName("WebWidget");
195  view->setFocusPolicy(Qt::StrongFocus);
196  view->setProperty("DisplayAlerts", false);
197  view->setProperty("DisplayScrollBars", false);
198  view->setProperty("Silent", true);
199  d->m_webView = view;
200 #else
201 # ifdef TTK_WEBKIT
202  QWebView *view = new QWebView(this);
203  view->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
204  view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
205  d->m_webView = view;
206 # elif defined TTK_WEBENGINE
207  QWebEngineView *view = new QWebEngineView(this);
208  d->m_webView = view;
209 # endif
210 #endif
211 }
212 
214 {
216  QVBoxLayout *layout = new QVBoxLayout(this);
217  layout->setSpacing(0);
218  layout->setContentsMargins(0, 0, 0, 0);
219 #if defined TTK_WEBKIT || defined TTK_WEBENGINE
220  d->m_topWidget = new QWidget(this);
221  d->m_topWidget->setFixedHeight(25);
222  d->m_topWidget->setStyleSheet(TTK::UI::PushButtonStyle01 + TTK::UI::WidgetStyle01);
223  QHBoxLayout *topLayout = new QHBoxLayout(d->m_topWidget);
224  topLayout->setContentsMargins(0, 0, 0, 0);
225  topLayout->setSpacing(25);
226 
227  d->m_buttonGroup = new QButtonGroup(this);
228  QPushButton *bt = new QPushButton(tr(" SongRecommend "), d->m_topWidget);
229  bt->setCursor(QCursor(Qt::PointingHandCursor));
230  d->m_buttonGroup->addButton(bt, 0);
231  bt = new QPushButton(tr(" SongRank "), d->m_topWidget);
232  bt->setCursor(QCursor(Qt::PointingHandCursor));
233  d->m_buttonGroup->addButton(bt, 1);
234  bt = new QPushButton(tr(" SongSinger "), d->m_topWidget);
235  bt->setCursor(QCursor(Qt::PointingHandCursor));
236  d->m_buttonGroup->addButton(bt, 2);
237  bt = new QPushButton(tr(" SongCategory "), d->m_topWidget);
238  bt->setCursor(QCursor(Qt::PointingHandCursor));
239  d->m_buttonGroup->addButton(bt, 3);
240  QtButtonGroupConnect(d->m_buttonGroup, this, kugouSongIndexChanged, TTK_SLOT);
241 
242  topLayout->addStretch(1);
243  topLayout->addWidget(d->m_buttonGroup->button(0));
244  topLayout->addWidget(d->m_buttonGroup->button(1));
245  topLayout->addWidget(d->m_buttonGroup->button(2));
246  topLayout->addWidget(d->m_buttonGroup->button(3));
247  topLayout->addStretch(1);
248 
249 #ifdef Q_OS_UNIX
250  d->m_buttonGroup->button(0)->setFocusPolicy(Qt::NoFocus);
251  d->m_buttonGroup->button(1)->setFocusPolicy(Qt::NoFocus);
252  d->m_buttonGroup->button(2)->setFocusPolicy(Qt::NoFocus);
253  d->m_buttonGroup->button(3)->setFocusPolicy(Qt::NoFocus);
254 #endif
255 
256  createWebViewer();
257  layout->addWidget(d->m_topWidget);
258  layout->addWidget(d->m_webView);
260 #else
261  Q_UNUSED(d);
262  QLabel *pix = new QLabel(this);
263  pix->setAlignment(Qt::AlignCenter);
264  pix->setStyleSheet("background:white;");
265  pix->setPixmap(QPixmap(":/image/lb_no_module"));
266  layout->addWidget(pix);
267 #endif
268  setLayout(layout);
269 }
270 
272 {
274  QVBoxLayout *layout = new QVBoxLayout(this);
275  layout->setSpacing(0);
276  layout->setContentsMargins(0, 0, 0, 0);
277 #if defined TTK_WEBKIT || defined TTK_WEBENGINE
278  d->m_topWidget = new QWidget(this);
279  d->m_topWidget->setFixedHeight(25);
280  d->m_topWidget->setStyleSheet(TTK::UI::PushButtonStyle01 + TTK::UI::WidgetStyle01);
281  QHBoxLayout *topLayout = new QHBoxLayout(d->m_topWidget);
282  topLayout->setContentsMargins(0, 0, 0, 0);
283  topLayout->setSpacing(50);
284 
285  d->m_buttonGroup = new QButtonGroup(this);
286  QPushButton *bt = new QPushButton(tr(" RadioPublic "), d->m_topWidget);
287  bt->setCursor(QCursor(Qt::PointingHandCursor));
288  d->m_buttonGroup->addButton(bt, 0);
289  bt = new QPushButton(tr(" RadioHigh "), d->m_topWidget);
290  bt->setCursor(QCursor(Qt::PointingHandCursor));
291  d->m_buttonGroup->addButton(bt, 1);
292  QtButtonGroupConnect(d->m_buttonGroup, this, kugouRadioIndexChanged, TTK_SLOT);
293 
294  topLayout->addStretch(1);
295  topLayout->addWidget(d->m_buttonGroup->button(0));
296  topLayout->addWidget(d->m_buttonGroup->button(1));
297  topLayout->addStretch(1);
298 
299 #ifdef Q_OS_UNIX
300  d->m_buttonGroup->button(0)->setFocusPolicy(Qt::NoFocus);
301  d->m_buttonGroup->button(1)->setFocusPolicy(Qt::NoFocus);
302 #endif
303 
304  createWebViewer();
305  layout->addWidget(d->m_topWidget);
306  layout->addWidget(d->m_webView);
308 #else
309  Q_UNUSED(d);
310  QLabel *pix = new QLabel(this);
311  pix->setAlignment(Qt::AlignCenter);
312  pix->setStyleSheet("background:white;");
313  pix->setPixmap(QPixmap(":/image/lb_no_module"));
314  layout->addWidget(pix);
315 #endif
316  setLayout(layout);
317 }
318 
320 {
322  QVBoxLayout *layout = new QVBoxLayout(this);
323  layout->setSpacing(0);
324  layout->setContentsMargins(0, 0, 0, 0);
325 #if defined TTK_WEBKIT || defined TTK_WEBENGINE
326  createWebViewer();
327  layout->addWidget(d->m_webView);
328 # ifdef Q_OS_WIN
329  TTKObjectCast(QAxWidget*, d->m_webView)->dynamicCall("Navigate(const QString&)", QKugouUrl::makeListUrl());
330 # else
331 # ifdef TTK_WEBENGINE
332  TTKObjectCast(QWebEngineView*, d->m_webView)->setUrl(QKugouUrl::makeListUrl());
333 # else
334  TTKObjectCast(QWebView*, d->m_webView)->setUrl(QKugouUrl::makeListUrl());
335 # endif
336 # endif
337 #else
338  Q_UNUSED(d);
339  QLabel *pix = new QLabel(this);
340  pix->setAlignment(Qt::AlignCenter);
341  pix->setStyleSheet("background:white;");
342  pix->setPixmap(QPixmap(":/image/lb_no_module"));
343  layout->addWidget(pix);
344 #endif
345  setLayout(layout);
346 }
347 
349 {
351  QVBoxLayout *layout = new QVBoxLayout(this);
352  layout->setSpacing(0);
353  layout->setContentsMargins(0, 0, 0, 0);
354 #if defined TTK_WEBKIT || defined TTK_WEBENGINE
355  d->m_topWidget = new QWidget(this);
356  d->m_topWidget->setFixedHeight(25);
357  d->m_topWidget->setStyleSheet(TTK::UI::PushButtonStyle01 + TTK::UI::WidgetStyle01);
358  QHBoxLayout *topLayout = new QHBoxLayout(d->m_topWidget);
359  topLayout->setContentsMargins(0, 0, 0, 0);
360  topLayout->setSpacing(50);
361 
362  d->m_buttonGroup = new QButtonGroup(this);
363  QPushButton *bt = new QPushButton(tr(" MVRadio "), d->m_topWidget);
364  bt->setCursor(QCursor(Qt::PointingHandCursor));
365  d->m_buttonGroup->addButton(bt, 0);
366  bt = new QPushButton(tr(" MVRecommend "), d->m_topWidget);
367  bt->setCursor(QCursor(Qt::PointingHandCursor));
368  d->m_buttonGroup->addButton(bt, 1);
369  QtButtonGroupConnect(d->m_buttonGroup, this, kugouMVIndexChanged, TTK_SLOT);
370 
371  topLayout->addStretch(1);
372  topLayout->addWidget(d->m_buttonGroup->button(0));
373  topLayout->addWidget(d->m_buttonGroup->button(1));
374  topLayout->addStretch(1);
375 
376 #ifdef Q_OS_UNIX
377  d->m_buttonGroup->button(0)->setFocusPolicy(Qt::NoFocus);
378  d->m_buttonGroup->button(1)->setFocusPolicy(Qt::NoFocus);
379 #endif
380 
381  createWebViewer();
382  layout->addWidget(d->m_topWidget);
383  layout->addWidget(d->m_webView);
385 #else
386  Q_UNUSED(d);
387  QLabel *pix = new QLabel(this);
388  pix->setAlignment(Qt::AlignCenter);
389  pix->setStyleSheet("background:white;");
390  pix->setPixmap(QPixmap(":/image/lb_no_module"));
391  layout->addWidget(pix);
392 #endif
393  setLayout(layout);
394 }
395 
397 {
399  QVBoxLayout *layout = new QVBoxLayout(this);
400  layout->setSpacing(0);
401  layout->setContentsMargins(0, 0, 0, 0);
402 #if defined TTK_WEBKIT || defined TTK_WEBENGINE
403  createWebViewer();
404  layout->addWidget(d->m_webView);
406 #else
407  Q_UNUSED(d);
408  QLabel *pix = new QLabel(this);
409  pix->setAlignment(Qt::AlignCenter);
410  pix->setStyleSheet("background:white;");
411  pix->setPixmap(QPixmap(":/image/lb_no_module"));
412  layout->addWidget(pix);
413 #endif
414  setLayout(layout);
415 }
416 
418 {
420  const QList<QAbstractButton*> &buttons = d->m_buttonGroup->buttons();
421  for(int i = 0; i < buttons.count(); ++i)
422  {
423  buttons[i]->setStyleSheet(TTK::UI::PushButtonStyle01);
424  }
425  buttons[index]->setStyleSheet(TTK::UI::PushButtonStyle02);
426 }
static QString makeSongRankUrl()
Definition: qkugouurl.cpp:13
static QString makeRadioHighFmUrl()
Definition: qkugouurl.cpp:33
void kugouRadioIndexChanged(int index)
void createKugouSingleWidget()
void createWebViewer()
static QString makeMVRadioUrl()
Definition: qkugouurl.cpp:43
static const QString PushButtonStyle01
PushButton.
static const QString WidgetStyle01
Widget.
void createKugouListWidget()
void createKugouRadioWidget()
QButtonGroup * m_buttonGroup
static const QString PushButtonStyle02
static QString makeSongCategoryUrl()
Definition: qkugouurl.cpp:23
QKugouWindow(Module type, QWidget *parent=nullptr)
static QString makeSongSingerUrl()
Definition: qkugouurl.cpp:18
The class of the kugou window widget.
Definition: qkugouwindow.h:30
void kugouSongIndexChanged(int index)
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:177
static QString makeListUrl()
Definition: qkugouurl.cpp:38
static QString makeRadioPublicUrl()
Definition: qkugouurl.cpp:28
#define TTK_SLOT
Definition: ttkqtglobal.h:165
#define QtButtonGroupConnect(p, q, f, s)
Button group connect.
Definition: ttkqtcompat.h:101
static QString makeKuiSheUrl()
Definition: qkugouurl.cpp:58
The class of the kugou window widget private.
void createKugouMovieWidget()
static QString makeSongRecommendUrl()
Definition: qkugouurl.cpp:8
static QString makeMVRecommendUrl()
Definition: qkugouurl.cpp:48
void changeClickedButtonStyle(int index)
#define TTK_INIT_PRIVATE(Class)
Definition: ttkprivate.h:33
The class of the ttk private base.
Definition: ttkprivate.h:48
void setUrl(const QString &url)
void createKugouSongWidget()
#define TTK_D(Class)
Definition: ttkprivate.h:41
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:60
void kugouMVIndexChanged(int index)