和coyotte508一起做项目的时候发现Qt自带的Widget不大够用了,于是和他一起做了两个。
一个是图片按钮。这是一个基于QAbstractButton的按钮,按钮的实体是图片,coyotte508实现的时候忽略了按钮被按下时的效果,我给他完善了一下。
class QImageButtonP : public QAbstractButton
{
Q_OBJECT
public:
QImageButtonP(const QString &normal, const QString &hovered, const QString &pressed, const QString &checked ="");
QSize sizeHint() const;
QSize minimumSizeHint() const;
QSize maximumSize() const;
void changePics(const QString &normal, const QString &hovered, const QString &pressed, const QString &checked = "");
protected:
void paintEvent(QPaintEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
private:
QPixmap myPic, myHoveredPic, myCheckedPic, myPressedPic;
int lastUnderMouse; // last mouse pos recorded
bool bpressed;
enum State {
Normal,
Hovered,
Checked,
Pressed
};
int lastState;
};
QImageButtonP :: QImageButtonP ( const QString &normal , const QString &hovered , const QString &pressed , const QString &checked )
: myPic(normal), myHoveredPic(hovered), myPressedPic(pressed), lastUnderMouse(-1), bpressed(false)
{
setFixedSize(myPic.size());
#if defined(WIN32) || defined(WIN64)
setMask(::mask(myPic));
#endif
lastState = Normal;
/* Both are necessary for some styles */
setMouseTracking(true);
setAttribute(Qt::WA_Hover, true);
if (checked != "")
myCheckedPic = QPixmap(checked);
}
void QImageButtonP::changePics(const QString &normal, const QString &hovered,const QString &pressed, const QString &checked)
{
myPic = QPixmap(normal);
myHoveredPic = QPixmap(hovered);
myPressedPic = QPixmap(pressed);
if (checked != "")
myCheckedPic = QPixmap(checked);
#if defined(WIN32) || defined(WIN64)
setMask(lastState == Checked ? ::mask(myCheckedPic) : (lastState == Normal ? ::mask(myPic) : (lastState == Pressed ? ::mask(myPressedPic) : ::mask(myHoveredPic))));
#endif
update();
}
void QImageButtonP::mousePressEvent(QMouseEvent *e)
{
bpressed = true;
QAbstractButton::mousePressEvent(e);
}
void QImageButtonP::mouseReleaseEvent(QMouseEvent *e)
{
bpressed = false;
QAbstractButton::mouseReleaseEvent(e);
}
QSize QImageButtonP::sizeHint() const
{
return myPic.size();
}
QSize QImageButtonP::minimumSizeHint() const
{
return sizeHint();
}
QSize QImageButtonP::maximumSize() const
{
return sizeHint();
}
void QImageButtonP::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
int newState;
if ((this->isChecked()) && !myCheckedPic.isNull()) {
newState = Checked;
painter.drawPixmap(e->rect(), myCheckedPic, e->rect());
}else if(this->isDown () && !myPressedPic.isNull()) {
newState = Pressed;
painter.drawPixmap(e->rect(), myPressedPic, e->rect());
}else {
if (!underMouse()) {
newState = Normal;
painter.drawPixmap(e->rect(), myPic, e->rect());
}
else {
newState = Hovered;
painter.drawPixmap(e->rect(), myHoveredPic, e->rect());
}
}
if (newState != lastState) {
lastState = newState;
#if defined(WIN32) || defined(WIN64)
setMask(lastState == Checked ? ::mask(myCheckedPic) : (lastState == Normal ? ::mask(myPic) : (lastState == Pressed ? ::mask(myPressedPic) : ::mask(myHoveredPic))));
#endif
}
lastUnderMouse = underMouse();
}
void QImageButtonP::mouseMoveEvent(QMouseEvent *)
{
if (int(underMouse()) == lastUnderMouse)
return;
update();
}
另一个是IRC聊天输入框模式的一个输入框,输入框对光标-上和光标-下两个键盘输入产生反应,能够回到之前输入的内容或者返回当前内容。
class QIRCLineEdit : public QLineEdit
{
Q_OBJECT
public:
QIRCLineEdit();
private:
void keyPressEvent(QKeyEvent *);
QList<QString> m_Inputlist1;//Stores the inputed strings,up list.
QList<QString> m_Inputlist2;//Stores the inputed strings,down list.
//QString m_Currentline;//Stores a copy of the current text in the LineEdit.
public slots:
void myTextEdited();
void myclear();
};
QIRCLineEdit :: QIRCLineEdit ()
{
connect(this,SIGNAL(textEdited(QString)),this,SLOT(myTextEdited()));
}
void QIRCLineEdit::keyPressEvent(QKeyEvent *e)
{
if(e->key() == Qt::Key_Up) {
if(text()==""){
if(m_Inputlist1.empty()){
}else{
setText(m_Inputlist1.last());
m_Inputlist1.removeLast();
}
}else if(text()!=""){
m_Inputlist2.append(text());
if(m_Inputlist1.empty()){
clear();
}else{
setText(m_Inputlist1.last());
m_Inputlist1.removeLast();
}
}
}else if(e->key() == Qt::Key_Down) {
if(text()==""){
if(m_Inputlist2.empty()){
}else{
setText(m_Inputlist2.first());
m_Inputlist2.removeFirst();
}
}else if(text()!=""){
if(m_Inputlist2.empty()){
m_Inputlist1.append(text());
clear();
}else{
m_Inputlist1.append(text());
setText(m_Inputlist2.first());
m_Inputlist2.removeFirst();
}
}
}else{
QLineEdit::keyPressEvent(e);
}
}
void QIRCLineEdit::myTextEdited()
{
//if(!m_Inputlist2.empty()) m_Inputlist1.append(m_Currentline);
m_Inputlist2.clear();
}
void QIRCLineEdit::myclear()
{
if(text()!=""){
m_Inputlist1.append(text());
}
QLineEdit::clear();
}
可能因为用Chrome,博客园现在这个添加代码的功能算是残废了- -也懒的修了- -直接贴算了OTZ
以上俩类欢迎查错。