QScrollArea類提供了一個可以滾動的可視視窗和兩個捲軸。如果我們想給一個控制項加上一個捲軸,從QScrollArea繼承會比設計我們自己的QScrollBar類實現滾動函數更簡單。
Figure 6.11. QScrollArea's constituent widgets
調用QScrollArea的setWidget()函數就能給控制項加上捲軸。QScrollArea自動把控制項設定為視圖(viewport,QScrollArea::viewport()得到)的一個子控制項。例如,如果我們想給第五章的IconEditor加上捲軸,我們可以這樣寫代碼:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
IconEditor *iconEditor = new IconEditor;
iconEditor->setIconImage(QImage(":/images/mouse.png"));
QScrollArea scrollArea;
scrollArea.setWidget(iconEditor);
scrollArea.viewport()->setBackgroundRole(QPalette::Dark);
scrollArea.viewport()->setAutoFillBackground(true);
scrollArea.setWindowTitle(QObject::tr("Icon Editor"));
scrollArea.show();
return app.exec();
在QScrollArea控制項上顯示控制項的當前尺寸或者使用控制項的sizeHint。調用setWidgetResizable(true),QScrollArea自動改變控制項的大小。
當視圖小於控制項大小時,捲軸會自動出現。也可以設定捲軸一直顯示:
scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scrollArea.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
Figure 6.12. Resizing a QScrollArea
QScrollArea繼承了QAbstractScrollArea所有功能。QTextEdit和QAbstractItemView也是繼承自QAbstractScrollArea,這些類不需要使用QScrollArea。
#ifndef FILEMANEGE_STATE_H
#define FILEMANEGE_STATE_H
#include <QScrollArea>
#include "button_base.h"
#include <QProcess>
class QFrame;
//class QScrollArea;
class QGridLayout;
class Document_manager_State : public QScrollArea
{
Q_OBJECT
public:
explicit Document_manager_State(QWidget *parent = 0);
virtual ~Document_manager_State();
void translatestring_state1();
QProcess *prcocess;
signals:
public slots:
void basebutton_clicked();
private:
// QScrollArea* scroll;
QFrame *frame;
QGridLayout *layout;
void createbuttons(void);
};
#endif // FILEMANEGE_STATE_H
#include "filemanege_state.h"
#include "Qtglobal.h"
#include <QtGui>
Document_manager_State::Document_manager_State(QWidget *parent) :
QScrollArea(parent)
{
// prcocess = new QProcess(this);
/* scroll = new QScrollArea(0);
frame = new QFrame(scroll);
scroll->setWidget(frame);
scroll->setWidgetResizable(true)*/
qDebug("filemanege :");
frame = new QFrame(this);
frame->setFrameStyle(QFrame::NoFrame);
frame->setLineWidth(0);
QVBoxLayout *vlayout = new QVBoxLayout(frame);
layout = new QGridLayout();
layout->setMargin(0);
layout->setHorizontalSpacing(50);
layout->setVerticalSpacing(10);
createbuttons();
vlayout->addLayout(layout);
QSpacerItem *verticalSpacer = new QSpacerItem(20, 452, QSizePolicy::Minimum, QSizePolicy::Expanding);
vlayout->addItem(verticalSpacer);
frame->setLayout(vlayout);
this->setWidget(frame);
this->setWindowFlags(Qt::SplashScreen);
this->setFrameStyle(QFrame::NoFrame);
// frame->setLayout(layout);
// scroll->show();
// QVBoxLayout *mainlayout=new QVBoxLayout;
// mainlayout->addWidget(scroll);
// this->setLayout(mainlayout);
// setWindowFlags(Qt::FramelessWindowHint);
this->setFixedSize(SCREEN_MAINWIDGET_WIDTH,SCREEN_MAINWIDGET_HEIGHT);
setGeometry(SCREEN_MAINWIDGET_GEOMETRY_X,SCREEN_MAINWIDGET_GEOMETRY_Y,SCREEN_MAINWIDGET_WIDTH,SCREEN_MAINWIDGET_HEIGHT);
}
Document_manager_State::~Document_manager_State()
{
}
void Document_manager_State::translatestring_state1()
{
}
void Document_manager_State::createbuttons(void)
{
QDir programDir = QDir(PROGRAM_PATH_CHECK);
QDir imageDir= QDir(PICTURE_PATH_DESK_CHECK);
QStringList files;
QIcon *icon;
static QString transName;
files = programDir.entryList(QStringList("*"),
QDir::Files | QDir::NoSymLinks|QDir::Executable);
int row,colum;
for (int i=0; i<files.size(); i++)
{
row=i/4;
colum=i%4;
qDebug("files[i] is %s",qPrintable(files[i]));
Button_Base *toolbutton=new Button_Base;
toolbutton->setFixedSize(60,80);
toolbutton->setText(files[i]);
icon=new QIcon;
if(imageDir.exists(files[i]+tr(".png")))
{
icon->addFile(tr(PICTURE_PATH_DESK_CHECK)+files[i]+".png");
}
else
{
icon->addFile(tr(PICTURE_PATH_DESK_CHECK)+"music.png");
}
toolbutton->setIcon(*(icon));
transName=QApplication::translate("Check_Sate",files[i].toLatin1().data());
toolbutton->setText(transName);
toolbutton->setObjectName(files[i]);
layout->addWidget(toolbutton,row,colum);
}
}
void Document_manager_State::basebutton_clicked()
{
prcocess->start("/opt/Qt/applications/programs/serial");
}