之前我写过一个可以直接显示图片的Button: http://blog.csdn.net/aaa20090987/article/details/6789380
当时为了方便,直接用QFrame作为它的基类,结果(布局,使用等)十分不方便,
还是老老实实地用 QAbstractButton 作为基类,再用paintEvent来画图吧
//tqt.h #ifndef TQT_H_ #define TQT_H_ #include <QtGui> #include <QtCore> class PictureButton : public QAbstractButton { Q_OBJECT private: QPixmap pixmap; protected: virtual void paintEvent(QPaintEvent *event); virtual QSize sizeHint() const; public: PictureButton(const QString &path, QWidget *parent=0); PictureButton(QWidget *parent = 0); ~PictureButton(); void setPixmap(const QString &path); }; class Widget : public QWidget { Q_OBJECT private: QLabel *label; PictureButton *prevButton; PictureButton *nextButton; int num; public: Widget(QWidget *parent = 0); ~Widget(); public slots: void ClickedPrevButton(); void ClickedNextButton(); }; #endif //tqt.cpp #include "tqt.h" PictureButton::PictureButton(const QString &path, QWidget *parent/* =0 */) : QAbstractButton(parent) { setPixmap(path); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); } PictureButton::PictureButton(QWidget *parent /* = 0 */) : QAbstractButton(parent) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); } PictureButton::~PictureButton() { } void PictureButton::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(0, 0, width(), height(), pixmap); } QSize PictureButton::sizeHint() const { return pixmap.size(); } void PictureButton::setPixmap(const QString &path) { pixmap.load(path); update(); } Widget::Widget(QWidget *parent) : QWidget(parent) { num = 0; label = new QLabel("0", this); //prev.jpg和next.jpg是当前文件夹中的两张JPG图片 prevButton = new PictureButton("prev.jpg", this); nextButton = new PictureButton("next.jpg", this); QHBoxLayout *subLayout = new QHBoxLayout; QVBoxLayout *layout = new QVBoxLayout; subLayout->addWidget(prevButton); subLayout->addWidget(nextButton); layout->addWidget(label); layout->addLayout(subLayout); setLayout(layout); setWindowTitle("Widget"); resize(200, 200); connect(prevButton, SIGNAL(clicked()), this, SLOT(ClickedPrevButton())); connect(nextButton, SIGNAL(clicked()), this, SLOT(ClickedNextButton())); } Widget::~Widget() { } void Widget::ClickedPrevButton() { num--; label->setText(QString::number(num)); } void Widget::ClickedNextButton() { num++; label->setText(QString::number(num)); } //main.cpp #include "tqt3.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }