发生甚么事了?
噢,原来是左天,一个高中同学问我能不能写个点名器,我说可以.
为什么选Qt
Win32 到处都能跑,但是太麻烦,果断放弃.
MFC 比 Win32 方便一点,但是入门同样麻烦,查了半个小时资料,弃之.
EasyX 容易上手,但是大部分控件需要自己实现,弃之.
Qt
容易上手,工作量小(才不会说是因为方便抄代码和改代码).
点名器的基本原理
我们给每个名字编号,于是点名的过程就变成了一个生成随机数的过程,所以点名器就相当于一个随机数生成器.
界面设计
新建 mainWindow 项目,(假设)项目名为“ RollCall ”. 双击 .ui
文件,拖入一个 TextEdit(用于显示文本信息)、两个 PushButton
空间(用于触发和暂停 QTimer 定时器). “开始”按钮对象名设置为 start_Btn
,暂停按钮对象名设置为 stop_Btn .
设置背景,首先在项目中新建一个“.qrc”文件,双击打开,设置前缀(假设)/img,添加资源文件.
回到设计窗口,修改 MainWindow 的 styleSheet 属性为
background-image:url(":/img/. "); 同理,为 textEdit 、 start_Btn
和 stop_Btn 设置背景.
需要注意的是对主窗口的设置对子窗口也会生效,所以建议重新进行设置保证效果.
这里用了一张半透明的图片当背景实现透明效果(然而懒得搞图床所以并没有图).
文件读写
在mainwindow.h文件下MainWindow类下添加成员函数:void
readFile()用于读取 .txt文件.
使用 QString 临时存储一行名字,处理后加入数组.
这里采用不定长数组 QVector 来储存名单,人数通过 count() 获取并储存在
total 中.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void MainWindow::readFile () { QFile file ("../RollCall/名单.txt" ) ; if (!file.open (QIODevice::ReadOnly | QIODevice::Text)) { qDebug ()<< "open file failure" ; return ; } else { QString array; while (!file.atEnd ()){ array = file.readLine (); array = array.trimmed (); name_list.append (array); } total = name_list.count (); } file.close (); }
计时器与随机数
见参考资料
完整代码
点我查看完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> #include <QTextEdit> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow ; }QT_END_NAMESPACE class MainWindow : public QMainWindow{ Q_OBJECT public : MainWindow (QWidget *parent = nullptr ); ~MainWindow (); void readFile () ; private slots: void on_start_Btn_clicked () ; void srand () ; void on_stop_Btn_clicked () ; private : Ui::MainWindow *ui; QVector <QString> name_list; QTimer *timer = new QTimer; }; #endif #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFile> #include <QDebug> #include <QIODevice> #include <QTextCodec> #include <QTextStream> #include <QVector> #include <QtGlobal> #include <QTime> int total = 1501 ;MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent) , ui (new Ui::MainWindow) { ui->setupUi (this ); readFile (); ui->textEdit->setText ("点名" ); ui->textEdit->setReadOnly (true ); ui->textEdit->setAlignment (Qt::AlignCenter); connect (timer,SIGNAL (timeout ()),this ,SLOT (srand ())); } MainWindow::~MainWindow () { delete ui; } void MainWindow::readFile () { QFile file ("../RollCall/名单.txt" ) ; if (!file.open (QIODevice::ReadOnly | QIODevice::Text)) { qDebug ()<< "open file failure" ; return ; } else { QString array; while (!file.atEnd ()){ array = file.readLine (); array = array.trimmed (); name_list.append (array); } total = name_list.count (); } file.close (); } void MainWindow::on_start_Btn_clicked () { timer->start (100 ); } void MainWindow::on_stop_Btn_clicked () { timer->stop (); } void MainWindow::srand () { qsrand (QTime (0 ,0 ,0 ,0 ).msecsTo ((QTime::currentTime ()))); ui->textEdit->clear (); int num = qrand ()%total; ui->textEdit->setText (name_list[num]); ui->textEdit->setAlignment (Qt::AlignCenter); } #include "mainwindow.h" #include <QApplication> #include <QTextCodec> int main (int argc, char *argv[]) { QApplication a (argc, argv) ; MainWindow w; w.setWindowTitle ("点名器" ); w.show (); return a.exec (); }
主要参考资料
https://blog.csdn.net/qq_29406323/article/details/81450361