分类: C/C++
2009-05-21 22:35:16
#include
#include "window.h"
#include "cximage/ximage.h"
//int main(int argc, char *argv[])
//{
// QApplication app(argc, argv);
// Window window;
// //window.setSourceModel(createMailModel(&window));
// window.show();
// return app.exec();
//}
#include
#include
#include
#include
QRegion roundedRect(const QRect& rect, int r)
{
QRegion region;
// middle and borders
region += rect.adjusted(r, 0, -r, 0);
region += rect.adjusted(0, r, 0, -r);
// top left
QRect corner(rect.topLeft(), QSize(r*2, r*2));
region += QRegion(corner, QRegion::Rectangle);
// top right
corner.moveTopRight(rect.topRight());
region += QRegion(corner, QRegion::Rectangle);
// bottom left
corner.moveBottomLeft(rect.bottomLeft());
region += QRegion(corner, QRegion::Rectangle);
// bottom right
corner.moveBottomRight(rect.bottomRight());
region += QRegion(corner, QRegion::Rectangle);
return region;
}
class ImTitleBar : public QWidget
{
Q_OBJECT
public:
ImTitleBar(QWidget *parent) :QWidget(parent)
{
frame = new QFrame(this);
frame->resize(size());
frame->setObjectName("TitleBar");
setAutoFillBackground(false) ;
setAttribute(Qt::WA_TranslucentBackground);
// Use a brush with a Highlight color role to render the background
setBackgroundRole(QPalette::Highlight) ;
}
protected:
void paintEvent(QPaintEvent *)
{
frame->resize(size());
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
private:
QFrame *frame;
CxImage m_img;
};
class TitleBar : public QWidget
{
Q_OBJECT
public:
TitleBar(QWidget *parent)
{
frame = new QFrame(this);
frame->resize(size());
frame->setObjectName("TitleBarBg");
// Don't let this widget inherit the parent's backround color
setAutoFillBackground(false) ;
setAttribute(Qt::WA_TranslucentBackground);
// Use a brush with a Highlight color role to render the background
setBackgroundRole(QPalette::Highlight) ;
//setPalette(QPalette(QColor(250, 0, 0)));
minimize = new QToolButton(this) ;
maximize = new QToolButton(this) ;
close= new QToolButton(this) ;
setFixedHeight(35);
// Use the style to set the button pixmaps
QPixmap pix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton) ;
close->setIcon(pix) ;
close->setObjectName("Close");
maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton) ;
maximize->setIcon(maxPix) ;
pix = style()->standardPixmap(QStyle::SP_TitleBarMinButton) ;
minimize->setIcon(pix) ;
restorePix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton) ;
minimize->setMinimumHeight(20) ;
close->setMinimumHeight(20) ;
maximize->setMinimumHeight(20) ;
QLabel *label = new QLabel(this) ;
label->setObjectName("title");
label->setText("Window Label") ;
parent->setWindowTitle("Window Title") ;
QHBoxLayout *hbox = new QHBoxLayout(this) ;
hbox->addWidget(label) ;
hbox->addWidget(minimize) ;
hbox->addWidget(maximize) ;
hbox->addWidget(close) ;
hbox->insertStretch(1, 500) ;
hbox->setSpacing(0) ;
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) ;
maxNormal = false ;
connect(close, SIGNAL( clicked() ), parent, SLOT(close() ) ) ;
connect(minimize, SIGNAL( clicked() ), this, SLOT(showSmall() ) ) ;
connect(maximize, SIGNAL( clicked() ), this, SLOT(showMaxRestore() ) ) ;
}
public slots:
void showSmall()
{
parentWidget()->showMinimized() ;
}
void showMaxRestore()
{
if (maxNormal)
{
parentWidget()->showNormal() ;
maxNormal = !maxNormal ;
maximize->setIcon(maxPix) ;
}
else
{
parentWidget()->showMaximized() ;
maxNormal = !maxNormal ;
maximize->setIcon(restorePix) ;
}
}
protected:
void mousePressEvent(QMouseEvent *me)
{
startPos = me->globalPos() ;
clickPos = mapToParent(me->pos()) ;
}
void mouseMoveEvent(QMouseEvent *me)
{
if (maxNormal)
return ;
parentWidget()->move(me->globalPos() - clickPos) ;
}
protected:
void paintEvent(QPaintEvent *)
{
frame->resize(size());
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
private:
QFrame *frame;
QToolButton *minimize ;
QToolButton *maximize ;
QToolButton *close ;
QPixmap restorePix, maxPix ;
bool maxNormal ;
QPoint startPos ;
QPoint clickPos ;
};
class Frame : public QFrame
{
public:
Frame()
{
m_mouse_down = false ;
setFrameShape(Box) ;
setObjectName("titleFramexx");
// Make this a borderless window which can't
// be resized or moved via the window system
setWindowFlags(Qt::FramelessWindowHint) ;
setMouseTracking(true) ;
//setAttribute(Qt::WA_TranslucentBackground);
m_titleBar = new TitleBar(this) ;
m_content = new QWidget(this) ;
QVBoxLayout *vbox = new QVBoxLayout(this) ;
vbox->addWidget(m_titleBar) ;
vbox->setMargin(0) ;
vbox->setSpacing(0) ;
QVBoxLayout *layout = new QVBoxLayout(this) ;
layout->addWidget(m_content) ;
layout->setMargin(5) ;
layout->setSpacing(0) ;
vbox->addLayout(layout) ;
setMask(roundedRect(rect(), 10));
}
// Allows you to access the content area of the frame
// where widgets and layouts can be added
QWidget *contentWidget() const
{
return m_content ;
}
TitleBar *titleBar() const
{
return m_titleBar ;
}
void mousePressEvent(QMouseEvent *e)
{
m_old_pos = e->pos() ;
m_mouse_down = e->button() == Qt::LeftButton ;
}
void mouseMoveEvent(QMouseEvent *e)
{
int x = e->x() ;
int y = e->y() ;
if (m_mouse_down)
{
int dx = x - m_old_pos.x() ;
int dy = y - m_old_pos.y() ;
QRect g = geometry() ;
if (left)
g.setLeft(g.left() + dx) ;
if (right)
g.setRight(g.right() + dx) ;
if (bottom)
g.setBottom(g.bottom() + dy) ;
setGeometry(g) ;
m_old_pos = QPoint(!left ? e->x() : m_old_pos.x(), e->y()) ;
}
else
{
QRect r = rect() ;
left = qAbs(x - r.left()) <= 5 ;
right = qAbs(x - r.right()) <= 5 ;
bottom = qAbs(y - r.bottom()) <= 5 ;
bool hor = left | right ;
if (hor && bottom)
{
if (left)
setCursor(Qt::SizeBDiagCursor) ;
else
setCursor(Qt::SizeFDiagCursor) ;
}
else if (hor)
{
setCursor(Qt::SizeHorCursor) ;
}
else if (bottom)
{
setCursor(Qt::SizeVerCursor) ;
}
else
{
setCursor(Qt::ArrowCursor) ;
}
}
}
void mouseReleaseEvent(QMouseEvent *e)
{
Q_UNUSED(e) m_mouse_down = false ;
}
private:
TitleBar *m_titleBar ;
QWidget *m_content ;
QPoint m_old_pos ;
bool m_mouse_down ;
bool left, right, bottom ;
};
#include "main.moc"
int main(int argc, char **argv)
{
Q_INIT_RESOURCE(styles);
QApplication app(argc, argv) ;
Frame box ;
box.move(0,0) ;
QVBoxLayout *l = new QVBoxLayout(box.contentWidget()) ;
l->setMargin(0) ;
QTextEdit *edit = new QTextEdit(box.contentWidget()) ;
l->addWidget(edit) ;
l->addWidget(new QPushButton("Start")) ;
ImTitleBar *line = new ImTitleBar(NULL);
//TitleBar *line = new TitleBar((QWidget *)&box);
line->setFixedHeight(150);
/*QLabel *label = new QLabel(line) ;
label->setText("Window Label") ;
label->resize(200,150);*/
l->addWidget(line) ;
box.show() ;
QString sStyle ="QPushButton{ background-color:red; } \
TitleBar { color: red; } \
TitleBar#title { color: red;}\
TitleBar::title { color: red;}\
TitleBar QLabel { color: red;}\
QFrame#titleFrame {border: 0; border-image: url(:/images/titlebar_c.png) 0 0 0 0;}\
ImTitleBar QFrame#TitleBar {border-width: 30 30 5 30; border-image: url(:/images/titlebar_c.png) 30 30 5 30;}\
TitleBar QFrame#TitleBarBg {border-width: 30 30 5 30; border-image: url(:/images/titlebar_c.png) 30 30 5 30;}\
TitleBar QToolButton#Close{ background-color:red; }";
app.setStyleSheet(sStyle);
return app.exec() ;
}
//void RoundedWidget::resizeEvent(QResizeEvent* event)
//{
// QPixmap pixmap(size());
// QPainter painter(&pixmap);
// painter.fillRect(pixmap.rect(), Qt::white);
// painter.setBrush(Qt::black);
// painter.drawRoundRect(pixmap.rect());
// setMask(pixmap.createMaskFromColor(Qt::white));
//}