经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
QT 自定义模态对话框
来源:cnblogs  作者:碧水~蓝天  时间:2018/10/11 9:26:53  对本文有异议

新建一个MsgBox类

msgbox.h 代码

  1. #ifndef MSGBOX_H
  2. #define MSGBOX_H
  3. #include <QDialog>
  4. #include <QPushButton>
  5. #include <QLabel>
  6. #include <QMouseEvent>
  7. #include <QFont>
  8. #include <QPixmap>
  9. #include <QPainter>
  10. #include<QBitmap>
  11.  
  12. class MsgBox : public QDialog
  13. {
  14. Q_OBJECT
  15. public:
  16. MsgBox(QWidget *parent = 0);
  17. ~MsgBox();
  18. public:
  19. QPushButton *ok_button;
  20. QPushButton *close_button;
  21. QPushButton *cancel_button;
  22. QLabel *ask_label;
  23. QLabel *msg_label;
  24. QLabel *title_label;
  25. QString ok_text;
  26. QString cancel_text;
  27. public:
  28. void setInfo(QString title_info, QString info,QPixmap pixmap, bool is_ok_hidden,QString language);
  29. protected:
  30. QPoint move_point;
  31. bool mouse_press;
  32. void paintEvent(QPaintEvent *);
  33. void mousePressEvent( QMouseEvent * event );
  34. void mouseReleaseEvent( QMouseEvent *);
  35. void mouseMoveEvent(QMouseEvent *event);
  36. public slots:
  37. void okOperate();
  38. void cancelOperate();
  39. void closeOperate();
  40. };
  41. #endif // MSGBOX_H

msgbox.cpp 代码

  1. #include "msgbox.h"
  2. MsgBox::MsgBox(QWidget *parent)
  3. : QDialog(parent)
  4. {
  5. this->resize(320, 160);
  6. //获取主界面的宽度
  7. int width = this->width();
  8. int height = this->height();
  9. //初始化为未按下鼠标左键
  10. mouse_press = false;
  11. //设置标题栏隐藏
  12. this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
  13. close_button = new QPushButton(this);
  14. //close_button->loadPixmap(":/image/images/bg.png");
  15. close_button->setGeometry(width-30,5, 20, 20);
  16. close_button->setStyleSheet("border-image:url(:/image/images/closeBtn.png);");
  17. //设置标题
  18. title_label = new QLabel(this);
  19. title_label->setObjectName(QString::fromUtf8("labelOne"));
  20. QFont font = title_label->font();
  21. font.setBold(true);
  22. title_label->setFont(font);
  23. title_label->setGeometry(0, 0, width-50, 30);
  24. //设置提示图片
  25. msg_label = new QLabel(this);
  26. msg_label->setGeometry(20, 50, 36, 36);
  27. msg_label->setScaledContents(true);
  28. //设置提示信息,让QLabel能够自动判断并换行显示:
  29. ask_label = new QLabel(this);
  30. ask_label->setGeometry(65, 60, width-50, 25*2);
  31. ask_label->setWordWrap(true);
  32. ask_label->setAlignment(Qt::AlignTop);
  33. cancel_button = new QPushButton(this);
  34. cancel_button->resize(70, 25);
  35. cancel_button->move(width - cancel_button->width() - 10, height - 35);
  36. ok_button = new QPushButton(this);
  37. ok_button->resize(70, 25);
  38. ok_button->move(width - ok_button->width() - cancel_button->width() - 20, height - 35);
  39. ok_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
  40. cancel_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
  41. QObject::connect(ok_button, SIGNAL(clicked()), this, SLOT(okOperate()));
  42. QObject::connect(close_button, SIGNAL(clicked()), this, SLOT(closeOperate()));
  43. QObject::connect(cancel_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));
  44. }
  45. MsgBox::~MsgBox()
  46. {
  47. }
  48. //设置对话框信息
  49. void MsgBox::setInfo(QString title_info, QString info,QPixmap pixmap,bool is_ok_hidden,QString language)
  50. {
  51. title_label->setText(QString(" ") + title_info);
  52. //设置提示信息
  53. ask_label->setText(info);
  54. msg_label->setPixmap(pixmap);
  55. //是否隐藏确定按钮
  56. ok_button->setHidden(is_ok_hidden);
  57. if(is_ok_hidden)
  58. {
  59. if(language == "中文")
  60. {
  61. cancel_button->setText(tr("确定"));
  62. }
  63. else if(language == "英文")
  64. {
  65. cancel_button->setText(tr("OK"));
  66. }
  67. else if(language == "泰文")
  68. {
  69. cancel_button->setText(tr("????????"));
  70. }
  71. }
  72. else
  73. {
  74. if(language == "中文")
  75. {
  76. ok_button->setText(tr("确定"));
  77. cancel_button->setText(tr("取消"));
  78. }
  79. else if(language == "英文")
  80. {
  81. ok_button->setText(tr("OK"));
  82. cancel_button->setText(tr("Cancel"));
  83. }
  84. else if(language == "泰文")
  85. {
  86. ok_button->setText(tr("????????"));
  87. cancel_button->setText(tr("?????????"));
  88. }
  89. }
  90. //设置默认按钮为取消按钮
  91. cancel_button->setFocus();
  92. }
  93. void MsgBox::paintEvent(QPaintEvent *)
  94. {
  95. QPainter painter(this);
  96. painter.drawPixmap(rect(), QPixmap(":/image/images/close.png"));
  97. QBitmap bitmap(this->size());
  98. QPainter painter2(&bitmap);
  99. painter2.fillRect(bitmap.rect(), Qt::white);
  100. painter2.setBrush(QColor(0, 0, 0));
  101. painter2.drawRoundedRect(rect(), 4, 4);
  102. setMask(bitmap);
  103. }
  104. void MsgBox::mousePressEvent( QMouseEvent * event )
  105. {
  106. //只能是鼠标左键移动和改变大小
  107. if(event->button() == Qt::LeftButton)
  108. {
  109. mouse_press = true;
  110. }
  111. //窗口移动距离
  112. move_point = event->globalPos() - pos();
  113. }
  114. void MsgBox::mouseReleaseEvent( QMouseEvent *)
  115. {
  116. mouse_press = false;
  117. }
  118. void MsgBox::mouseMoveEvent(QMouseEvent *event)
  119. {
  120. //移动窗口
  121. if(mouse_press)
  122. {
  123. QPoint move_pos = event->globalPos();
  124. move(move_pos - move_point);
  125. }
  126. }
  127. //确认操作
  128. void MsgBox::okOperate()
  129. {
  130. this->accept();
  131. }
  132. //取消操作
  133. void MsgBox::cancelOperate()
  134. {
  135. this->reject();
  136. }
  137. //关闭窗体操作
  138. void MsgBox::closeOperate()
  139. {
  140. close();
  141. }

主函数调用代码:

  1. #include "msgbox.h"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. MsgBox w;
  8. w.setInfo(QString("提示:"),QString("是否关机?"),QPixmap(":/image/images/tip.png"),false,QString("中文"));
  9. w.show();
  10. return a.exec();
  11. }

目录构建图:

实现效果图:

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号