做播放器當然少不了播放列表,播放列表又好幾種形式,一種使用另外的窗口,如千千靜聽;
一種使用多標簽,如酷狗音樂;一種使用停靠窗口,如QQ影音。由於我做的是播放器,是在
4.3寸的屏上運行,便選擇了停靠窗口。
在Qt里停靠窗口是QDockWidget,它的顯示區域如圖,摘自Qt幫助文檔。
可以對它的屬性進行一系列的設置,具體的看幫助文檔。
可是當我使用QDockWidget后發現,右邊的列表居然占了屏幕一大半。於是我就用resize來調整它
的大小,可是依然如故;接着我又把QListWidget加上resize,結果還是如此。沒辦法了,只好借助
偉大的網絡了,原來是“QDockWidget acts as a wrapper for its child widget, custom size
hints, minimum and maximum sizes and size policies have to be implemented in the
child widget.”即我們要在子控件里設置大小,來自qt的faq,它給的代碼如下:
#include <QtGui>
class Label : public QLabel
{
public:
Label(QWidget *parent) : QLabel(parent)
{
setAutoFillBackground(true);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QPalette pal = palette();
pal.setBrush(QPalette::Window, Qt::red);
setText("The label");
setPalette(pal);
}
QSize sizeHint() const
{
return QSize(400, 500);
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QMainWindow box;
box.setCentralWidget(new QLabel("Central Widget", &box));
QDockWidget *dock = new QDockWidget(&box);
dock->setWidget(new Label(dock));
box.addDockWidget(Qt::TopDockWidgetArea, dock );
box.show();
return app.exec();
}
不過我可不想繼承QListWidget,於是繼續搜索,便找到了下面的方法,來自stackoverflow,
代碼如下:
//在頭文件里添加 private void setDockSize(QDockWidget *dock, int setWidth, int setHeight); public slots: void returnToOldMaxMinSizes(); //在源文件里添加 QSize oldMaxSize, oldMinSize; void MainWindow::setDockSize(QDockWidget* dock, int setWidth,int setHeight) { oldMaxSize=dock->maximumSize(); oldMinSize=dock->minimumSize(); if (setWidth>=0) if (dock->width()<setWidth) dock->setMinimumWidth(setWidth); else dock->setMaximumWidth(setWidth); if (setHeight>=0) if (dock->height()<setHeight) dock->setMinimumHeight(setHeight); else dock->setMaximumHeight(setHeight); QTimer::singleShot(1, this, SLOT(returnToOldMaxMinSizes())); } void MainWindow::returnToOldMaxMinSizes() { ui->dockWidget->setMinimumSize(oldMinSize); ui->dockWidget->setMaximumSize(oldMaxSize); }
大小調整解決了,可是QDockWidget還有個標題欄,即使不設置標題,它也會顯示空白的標題,這
與我的需求不符,可惜我不會隱藏,繼續搜索發現了一個非常天才的做法,來自Qt論壇,代碼如下:
QWidget * qw=new QWidget(this);
Dockwidget->setTitleBarWidget(qw);
哈哈,居然把標題欄重新設置為一個空的Widget。
