QT左右弹窗控件

QT自定义控件(左右方向弹出控件)

自定义控件存在的意义 :QT 内置控件丑,而且满足不了有些实际开发的需求。所以需要编写自定义控件来完成一些特殊需求。

效果展示

在这里插入图片描述

  1. 界面说明 :点击右侧中间的按钮会从左边或者右边弹出一个窗体,这个窗体还可以自定义。
  2. 功能说明 :单击按钮窗体弹出,再次单击窗体消失
  3. 补充说明:弹窗可自定义成任意控件。亦可以设置按钮与弹窗之间的 距离
代码:
// 自定义弹出窗体(其中的 myCalendar控件是自定义日历控件,请看我另一篇文章日历控件)
class toolWidget:public QWidget
{
   Q_OBJECT
public:
   toolWidget(QWidget*widget,int pos); // 控件类型  名字  弹出方向 0 left 1 right
   void createWidget();
   //virtual void additem()=0;
   void setWidgetInfo(QString name);
   void setWidStyle(QString name);
signals:
   void SigtoolWidget(int type);
   void SigListWidgetTextChanged(QString);
   void SigListWidgetDoubleClicked();
   void SigMyCalendarOkBtnClicked(QString);
public:
   QWidget*m_widget;
   int m_pos;
   int m_type;
   QString m_objName;
};
toolWidget::toolWidget(QWidget*widget,int pos):m_widget(widget),m_pos(pos)
{
// obj->metaObject()->className() == QStringLiteral("QPushButton") // 判断是不是QPushButton
  m_objName =widget->metaObject()->className();
  createWidget();
}
void toolWidget::createWidget()
{
   if(!m_widget)
   {
       return;
   }
   m_widget->setParent(this);
   QHBoxLayout*lay = new QHBoxLayout();
   lay->addWidget(m_widget);
   lay->setContentsMargins(1,1,1,1);
   this->setLayout(lay);
}

void toolWidget::setWidgetInfo(QString name)
{
   // 设置样式
   setWidStyle(name);
   // 曹函数响应

}

void toolWidget::setWidStyle(QString name)
{
   if(name == "QListWidget")
   {
       this->setStyleSheet("QWidget{background-color: rgb(233, 185, 110);border:3px solid gray;padding:3px 3px 3px 3px;}"
                           "QListWidget::item{color: rgb(78, 154, 6);height:20px;padding-left:5px;}"
                           "QListWidget::item:hover{color: rgb(92, 53, 102);}"
                           "QListWidget::item::selected:active{color:red;border-width:10;}"
                           "QListWidget::item:selected{color:red;border-width:10;}"
                           );
   }
}
// 自定义按钮窗体
class myButton : public QToolButton
{
   Q_OBJECT
public:
   explicit myButton(QWidget *parent = nullptr);
    ~myButton();
   //myButton(QWidget *parent = nullptr,int pos=0);
public:
   void initWidgetInfo();
   void toolWidgetCmd(QString name);
   void createTool(toolWidget*tools);
   void mousePressEvent(QMouseEvent *);
   void resizeEvent(QResizeEvent*);
   void moveEvent(QMoveEvent *);
   void myMoveEvent();
   void hideEvent(QHideEvent*);
   void setListParent(QWidget*parent);
   void setItemWidgetPos(int pos);
   void setSpacting(int spacing);
   void dealWithAnimation();

   void widgetMove(int x,int y);
signals:

public slots:
   void SlottoolWidget(int);
private:
  //QListWidget *m_list;
   toolWidget     *m_list;
   int m_pos;
   int m_spacing = 0;
};

myButton::myButton(QWidget *parent) : QToolButton(parent)
 ,m_list(NULL)
{
  //this->setListParent(parent);
  //this->setFixedSize(100,40);
  m_pos =1;
  m_spacing = 2;
 this->setStyleSheet("QWidget{background-color: rgb(233, 185, 110);color:green;border:3px solid gray;padding:3px 3px 3px 3px;}");

}
myButton::~myButton()
{
   if(m_list)
   {
       delete m_list;
       m_list = NULL;
   }

}
void myButton::createTool(toolWidget*tools)
{
   if(!tools)
   {
       return;
   }
   if(!m_list)
   {
       m_list = tools;

   }
   initWidgetInfo();
}
void myButton::initWidgetInfo()
{
   this->m_pos = m_list->m_pos;
   m_list->resize(this->width(),this->height()*6);
   QPoint point =this->mapToGlobal(QPoint(0,0));
   m_list->move(point.x(),point.y());
   m_list->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);// 顶层无边框窗体
   m_list->hide();
   m_list->setWidgetInfo(m_list->m_objName);
   toolWidgetCmd(m_list->m_objName);
}

void myButton::toolWidgetCmd(QString name)
{
   if(name == "QListWidget")
   {
       QListWidget*tlist = qobject_cast<QListWidget*>(m_list->m_widget);
       connect(tlist,&QListWidget::currentTextChanged,[=](QString text){
           this->setText(text);
       });
       connect(tlist,&QListWidget::doubleClicked,[=](){
           m_list->hide();
       });
   }
}

void myButton::setItemWidgetPos(int pos)
{
  m_pos = pos;
}
void myButton::setSpacting(int spacing)
{
   m_spacing = spacing;
}
void myButton::hideEvent(QHideEvent *)
{
   if(m_list)
   {
       if(m_list->isVisible())
       {
           m_list->hide();
       }
   }
}
void myButton::moveEvent(QMoveEvent *)
{
  qDebug()<<"moveEvent!";
  if(!m_list)
  {
      return;
  }
   int x = 0,y=0;
   QPoint point =this->mapToGlobal(QPoint(0,0));
   if(m_pos == 0)  // left
   {
      x= point.x()-this->width()-m_list->width()-m_spacing;

   }
   else //right
   {
       x = point.x()+m_spacing;
   }
   y = point.y()-m_list->height()/2+this->height()/2;
   m_list->move(this->width()+x,y);
   //m_list->move(0,0);
}

void myButton::myMoveEvent()
{
   qDebug()<<"mymoveEvent!";
   if(!m_list)
   {
       return;
   }
    int x = 0,y=0;
    QPoint point =this->mapToGlobal(QPoint(0,0));
    if(m_pos == 0)  // left
    {
       x= point.x()-this->width()-m_list->width()-m_spacing;

    }
    else //right
    {
        x = point.x()+m_spacing;
    }
    y = point.y()-m_list->height()/2+this->height()/2;
    m_list->move(this->width()+x,y);
}
void myButton::setListParent(QWidget *parent)
{
   if(!m_list||!parent)
   {
       return;
   }
   m_list->setParent(parent);
}
void myButton::mousePressEvent(QMouseEvent *)
{
   if(!m_list)
   {
       return;
   }
   if(!m_list->isVisible())
   {
       int x = 0,y =0;
       QPoint point =this->mapToGlobal(QPoint(0,0));

       if(m_pos==0)
       {
           //x= this->x()-this->width()-m_list->width()-m_spacing;
           x = point.x()-m_list->width()-m_spacing;
           y = point.y()-m_list->height()/2+this->height()/2;
           m_list->move(x,y);

           m_list->show();
           QPropertyAnimation *animation= new QPropertyAnimation(m_list,"geometry");
           animation->setDuration(200);
           animation->setStartValue(QRect(m_list->pos().x()+m_list->width(),m_list->pos().y(),m_list->width(),m_list->height()));
           animation->setEndValue(QRect(m_list->pos().x(),m_list->pos().y(),m_list->width(),m_list->height()));
           animation->start();
       }
       else
       {
           x =point.x()+m_spacing+m_list->width();
           y = point.y()-m_list->height()/2+this->height()/2;
           m_list->move(x,y);
           m_list->show();
           QPropertyAnimation *animation= new QPropertyAnimation(m_list,"geometry");
           animation->setDuration(200);
           animation->setStartValue(QRect(x-m_list->width(),m_list->pos().y(),m_list->width(),m_list->height()));
           animation->setEndValue(QRect(x,m_list->pos().y(),m_list->width(),m_list->height()));
           animation->start();


       }
   }
   else
   {

       m_list->hide();

   }
}

void myButton::resizeEvent(QResizeEvent *)
{
   m_list->resize(this->width(),this->height()*6);
}

void myButton::widgetMove(int x, int y)
{
   qDebug()<<"-------->";
   if(!m_list)
   {
       return;
   }
   int x1 = x-m_list->width()-m_spacing;
   int y1 = y-m_list->height()/2+this->height()/2;
   m_list->move(x1,y1);

}

void myButton::SlottoolWidget(int type)
{
  if(type == 0)
  {

  }
}

//调用 设置好目标属性后扔进toolwidget
void   run()
{
 	QListWidget*widget = new QListWidget;
    for(int i = 0;i<6;++i)
    {
        widget->addItem(QString::number(i));
    }
    //控件, 弹窗方向( 0左边其他右边)
    ui->toolButton->createTool(new toolWidget(widget,0));
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
弹窗Qt中常见的UI交互控件,可以用于提示信息、警告、错误等。Qt弹窗有多种实现方式,以下是其中两种常见的方法: 1. QMessageBox QMessageBox是Qt提供的弹窗控件,可以快速创建一个标准的弹窗,支持多种类型的弹窗,如提示、询问、警告、错误等。使用方式如下: ```cpp QMessageBox::information(this, "标题", "内容"); ``` 其中第一个参数是父窗口指针,第二个参数是弹窗标题,第三个参数是弹窗内容。除了information类型外,还有question、warning、critical等类型。 2. 自定义弹窗 如果需要更灵活的弹窗样式或交互方式,可以自定义弹窗。自定义弹窗的实现方式有很多种,这里介绍一种常见的方法:通过QWidget实现一个模态对话框。代码示例: ```cpp // 自定义弹窗类 class MyDialog : public QWidget { Q_OBJECT public: MyDialog(QWidget *parent = nullptr) : QWidget(parent) { setFixedSize(300, 200); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); // 添加控件 QLabel *label = new QLabel("提示信息", this); label->setGeometry(10, 10, 280, 80); label->setAlignment(Qt::AlignCenter); QPushButton *okBtn = new QPushButton("确定", this); okBtn->setGeometry(100, 120, 100, 40); connect(okBtn, &QPushButton::clicked, this, &MyDialog::accept); } void paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(QColor(255, 255, 255)); painter.setPen(Qt::NoPen); painter.drawRoundedRect(rect(), 10, 10); } }; // 弹出自定义弹窗 void MainWindow::on_pushButton_clicked() { MyDialog dlg(this); dlg.exec(); } ``` 在自定义弹窗类中,我们继承了QWidget,并重载了paintEvent函数以实现圆角矩形窗口。在构造函数中添加了弹窗控件,并且设置了窗口大小、样式等。在槽函数中创建自定义弹窗对象,并调用exec函数以模态方式弹出窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值