qt编程例子
QT新建一个窗口控制程序,以实现添加按钮点击弹出信息提示框为例

QT新建⼀个窗⼝控制程序,以实现添加按钮点击弹出信息提⽰框为例 最近在学习QT编程,为了后⾯把X86平台的项⽬移植在Linux平台上,这⾥简单记录⼀下,第⼀步的学习过程,建⽴新⼯程。
1.新建项⽬ “Application”,中间的列表框中列出了可以创建的应⽤程序的模板,各类应⽤程序如下:Qt Widgets Application,⽀持桌⾯平台的有图形⽤户界⾯(Graphic User Interface,GUI)界⾯的应⽤程序。
GUI 的设计完全基于 C++ 语⾔,采⽤ Qt 提供的⼀套 C++ 类库。
Qt Console Application,控制台应⽤程序,⽆ GUI 界⾯,⼀般⽤于学习 C/C++ 语⾔,只需要简单的输⼊输出操作时可创建此类项⽬。
Qt Quick Application,创建可部署的 Qt Quick 2 应⽤程序。
Qt Quick 是 Qt ⽀持的⼀套 GUI 开发架构,其界⾯设计采⽤ QML 语⾔,程序架构采⽤ C++ 语⾔。
利⽤ Qt Quick 可以设计⾮常炫的⽤户界⾯,⼀般⽤于移动设备或嵌⼊式设备上⽆边框的应⽤程序的设计。
Qt Quick Controls 2 Application,创建基于 Qt Quick Controls 2 组件的可部署的 Qt Quick 2 应⽤程序。
Qt Quick Controls 2 组件只有 Qt 5.7 及以后版本才有。
Qt Canvas 3D Application,创建 Qt Canvas 3D QML 项⽬,也是基于 QML 语⾔的界⾯设计,⽀持 3D 画布。
这⾥选择 Qt Widgets Application 。
⼀路 Next 下去 ⼀路 Next 下去,到 Kits 这⾥注意把编译⼯具都勾上,后续编译的时候,想编译不同版本都可以。
2.编辑项⽬ 项⽬新建完成就可以得到⼀个基础项⽬⼯程,可以编辑了。
在项⽬名称节点下⾯,分组管理着项⽬内的各种源⽂件,⼏个⽂件及分组分别为以下⼏项:Demo.pro 是项⽬管理⽂件,包括⼀些对项⽬的设置项。
qt开发例程

qt开发例程全文共四篇示例,供读者参考第一篇示例:Qt是一个跨平台的C++应用程序框架,是由挪威的Trolltech公司开发的。
Qt具有一套完善的类库和工具,可以轻松地实现图形用户界面、数据库操作、网络通信等功能。
Qt的特点是跨平台、易用性高、扩展性强、灵活性大,因此备受开发者的青睐。
本文将介绍一些Qt的开发例程,帮助读者更快速、更简单地掌握Qt的开发方法。
一、简单的Hello World程序我们来看一个简单的Hello World程序,这是最基础的Qt开发示例。
创建一个新的Qt项目,选择Qt Widgets Application模板,命名为HelloQt。
```cpp#include <QApplication>#include <QLabel>QLabel label("Hello, Qt!");label.show();return app.exec();}```在这个程序中,我们首先包含了QApplication和QLabel两个类的头文件,分别是Qt应用程序的主类和一个用于显示文本的类。
然后,我们创建了一个QLabel对象,并将其内容设置为"Hello, Qt!",最后调用show()方法显示出来。
我们调用app.exec()方法让程序开始运行。
二、使用信号与槽实现按钮点击事件class MyWidget : public QWidget{public:MyWidget(QWidget *parent = 0) : QWidget(parent){QPushButton *button = new QPushButton("Click me", this);connect(button, &QPushButton::clicked, this,&MyWidget::showMessage);}MyWidget widget;widget.show();在这个程序中,我们从QWidget类派生出了一个自定义的MyWidget类,在构造函数中创建了一个按钮,并通过connect()方法将按钮的clicked信号与自定义的showMessage槽函数连接起来。
QtTcpServer使用实例

QtTcpServer使用实例首先,我们需要在Qt项目中包含以下头文件,以便使用QtTcpServer类。
```cpp#include <QTcpServer>#include <QTcpSocket>#include <QList>```接下来,我们可以通过继承QTcpServer类来创建我们自己的TCP服务器类。
例如:```cppclass MyTcpServer : public QTcpServerQ_OBJECTpublic:MyTcpServer(QObject *parent = nullptr);protected:private:QList<QTcpSocket*> m_clients;};``````cppQTcpSocket *client = new QTcpSocket(this);if (!client->setSocketDescriptor(socketDescriptor))//错误处理client->deleteLater(;return;}m_clients.append(client);connect(client, &QTcpSocket::readyRead, [client, this QByteArray data = client->readAll(;//处理收到的数据});connect(client, &QTcpSocket::disconnected, [client, this m_clients.removeOne(client);client->deleteLater(;});```在这个例子中,我们首先创建一个QTcpSocket对象作为与客户端通信的套接字。
然后,我们使用setSocketDescriptor(函数将套接字描述符设置为我们接收到的套接字描述符。
72个qt小项目

72个qt小项目72个Qt小项目Qt是一种跨平台的C++应用程序框架,它提供了丰富的库和工具来帮助开发人员创建高质量的图形用户界面和应用程序。
在本文中,我们将介绍72个Qt小项目,这些项目可以帮助您学习和掌握Qt编程。
一、基础入门1. Hello World:这是一个经典的Qt示例,它展示了如何创建一个简单的窗口并在其中显示文本。
2. Calculator:这是一个简单的计算器应用程序,它演示了如何使用Qt实现基本的数学运算。
3. Image Viewer:这是一个简单的图像查看器,它演示了如何使用Qt加载和显示图像文件。
4. File Explorer:这是一个简单的文件浏览器应用程序,它演示了如何使用Qt访问文件系统并显示目录结构。
5. Text Editor:这是一个简单的文本编辑器应用程序,它演示了如何使用Qt实现基本的文本编辑功能。
6. Paint Program:这是一个简单的绘图程序,它演示了如何使用Qt 实现基本的绘图功能。
二、进阶应用7. RSS Reader:这是一个RSS阅读器应用程序,它演示了如何使用Qt解析XML数据并显示新闻源内容。
8. Weather App:这是一个天气应用程序,它演示了如何使用Qt获取天气数据并显示当前天气和预报。
9. Music Player:这是一个音乐播放器应用程序,它演示了如何使用Qt播放音频文件并显示歌曲信息。
10. Video Player:这是一个视频播放器应用程序,它演示了如何使用Qt播放视频文件并显示视频内容。
11. Image Editor:这是一个图像编辑器应用程序,它演示了如何使用Qt实现高级的图像处理功能。
12. Database Viewer:这是一个数据库查看器应用程序,它演示了如何使用Qt连接到数据库并显示数据表内容。
13. Chat Client:这是一个聊天客户端应用程序,它演示了如何使用Qt实现基本的网络通信功能。
qt的6个简单小案例

qt的6个简单小案例以下是6个简单的Qt案例:1. 窗口应用程序:创建一个简单的窗口应用程序,显示一个标签和一个按钮。
```cpp#include <QApplication>#include <QLabel>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel label("Hello Qt!");QPushButton button("Click me!");label.show();button.show();return app.exec();}```2. 对话框应用程序:创建一个对话框应用程序,显示一个输入框和一个按钮,并在按钮点击时弹出一个消息框。
```cpp#include <QApplication>#include <QLineEdit>#include <QPushButton>#include <QMessageBox>int main(int argc, char *argv[]){QApplication app(argc, argv);QLineEdit input;QPushButton button("Submit");QObject::connect(&button, &QPushButton::clicked, [&]() {QMessageBox::information(nullptr, "Message", "Input: " + input.text());});input.show();button.show();return app.exec();}3. 列表视图应用程序:创建一个列表视图应用程序,显示一个列表,并在选中项改变时弹出一个消息框。
qt listview model based用法示例

qt listview model based用法示例在Qt 中,`QML`(Qt Meta-Object Language)是一种用于构建用户界面的声明性语言,而`ListView`和`ListModel`是常用于显示列表数据的QML 组件。
以下是一个简单的示例,演示了如何使用`ListView` 和`ListModel` 创建一个基于模型的列表视图。
首先,创建一个名为`main.qml` 的QML 文件:```qmlimport QtQuick 2.15import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 300title: "ListView Model Example"ListView {width: parent.widthheight: parent.heightmodel: ListModel {ListElement { name: "Item 1" }ListElement { name: "Item 2" }ListElement { name: "Item 3" }ListElement { name: "Item 4" }}delegate: Item {width: parent.widthheight: 50Rectangle {width: parent.widthheight: 50color: "lightblue"Text {anchors.centerIn: parenttext: }}}}}```在这个示例中,我们创建了一个`ApplicationWindow`,内部包含一个`ListView` 组件。
`ListView` 的`model` 属性使用了一个`ListModel`,并在模型中包含了一些`ListElement`,每个元素都有一个`name` 属性。
Qt使用和常用代码

Qt使⽤和常⽤代码Qt使⽤和常⽤代码Qt基础和库QObject//删除obj->deleteLater()或 delete objdeleteLater会等这次事件循环结束再释放内存必须在运⾏事件循环的线程中调⽤//类型转化QObject *obj = new QTimer; // QTimer inherits QObjectQTimer *timer = qobject_cast<QTimer *>(obj);// timer == (QObject *)objQAbstractButton *button = qobject_cast<QAbstractButton *>(obj);// button == 0要转化的类必须继承QObject和声明Q_OBJECT宏//查找⼦类QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly); //事件过滤class KeyPressEater : public QObject{Q_OBJECT...protected:bool eventFilter(QObject *obj, QEvent *event) override;};bool KeyPressEater::eventFilter(QObject *obj, QEvent *event){if (event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);qDebug("Ate key press %d", keyEvent->key());return true;} else {// standard event processingreturn QObject::eventFilter(obj, event);}}And here's how to install it on two widgets:KeyPressEater *keyPressEater = new KeyPressEater(this);QPushButton *pushButton = new QPushButton(this);QListView *listView = new QListView(this);pushButton->installEventFilter(keyPressEater);listView->installEventFilter(keyPressEater);//注册函数到原对象系统Q_INVOKABLE void invokableMethod();使⽤QMetaObject::invokeMethod(obj, "invokableMethod");//原对象系统跨线程连接信号和槽参数不是qt基本类使⽤int id = qRegisterMetaType<MyStruct>();所有要使⽤信号和槽的类必须继承QObject和声明Q_OBJECT宏//属性Q_PROPERTY(type name(READ getFunction [WRITE setFunction] |MEMBER memberName [(READ getFunction | WRITE setFunction)])[RESET resetFunction][NOTIFY notifySignal][REVISION int][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])Q_PROPERTY(QString title READ title WRITE setTitle USER true)//信号signals:void signal_1();emit signal_1 发射信号//槽public slots:void slot_1();connect(obj, SIGNAL(signal_1), obj2, SLOT(slot_1));c++11connect(sender, &Sender::valueChanged, reciver, &Reciver::showValue)lambadconnect(sender, &Sender::valueChanged, [](){});⽀持编译时检查,⽀持相容类型⾃动转化,可以连接任何函数不⽤声明 slot如果信号和槽有重载:connect(sender, static_cast<void(QSpinBox::*) (int)> (&QSpinBox::valueChanged)) , this, &MainWindow::onSpinBoxChanged);qt基本容器QList<T>QLinkedList<T>QVector<T>QStack<T>QQueue<T>QSet<T>QMap<Key, T>QMultiMap<Key, T>QHash<Key, T>QMultiHash<Key, T>//JAVA风格遍历QList<QString> list;list << "A" << "B" << "C" << "D";QListIterator<QString> i(list);while (i.hasNext())qDebug() << i.next();QListIterator<QString> i(list);i.toBack();while (i.hasPrevious())qDebug() << i.previous();//迭代器中插⼊删除使⽤ QMutableMapIteratorQMap<QString, QString> map;map.insert("Paris", "France");map.insert("Guatemala City", "Guatemala");map.insert("Mexico City", "Mexico");map.insert("Moscow", "Russia");...QMutableMapIterator<QString, QString> i(map);while (i.hasNext()) {if (i.next().key().endsWith("City"))i.remove();}//STL风格遍历QList<QString> list;list << "A" << "B" << "C" << "D";QList<QString>::iterator i;for (i = list.begin(); i != list.end(); ++i)*i = (*i).toLower();//反向迭代QList<QString> list;list << "A" << "B" << "C" << "D";QList<QString>::reverse_iterator i;for (i = list.rbegin(); i != list.rend(); ++i)*i = i->toLower();}//只读QList<QString>::const_iterator i;for (i = list.constBegin(); i != list.constEnd(); ++i)qDebug() << *i;//foreach迭代---注意不要在迭代器⾥删除元素QLinkedList<QString> list;...foreach (const QString &str, list) {if (str.isEmpty())break;qDebug() << str;}数据库QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "Project"); //数据库类型,别名db.setDatabaseName("mysql"); db.setHostName("127.0.0.1");db.setUserName("root");db.setPassword("");db.open();//执⾏sql语句query = QSqlQuery(QSqlDatabase::database("Project"));query.exec("create table if not exists time_table (`time` text NOT NULL, `info` text)");//查询表query.exec(QString("select * from time_table"));while (query.next()) {QString info = query.value("info").toString();foreach (QString timeInfo, allTimeInfoList) {if(info.contains(timeInfo)) {QStringList &list= m_timeSendList[QTime::fromString(query.value("time").toString(), "hh::mm::ss")]; if(!list.contains(info)) {list.append(info);}break;}}}//tableviewmodel = new QSqlQueryModel(this);ui->tableView->setModel(model);model->setQuery(QString("SELECT *from %3 where time >= '%1' and time <= '%2'").arg(ui->dateTimeEdit->dateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(ui->dateTimeEdit_2->dateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(m_table), QSqlDatabase::database("Project"));//设置显⽰头if(model->columnCount() >= 4) {model->setHeaderData(0, Qt::Horizontal, tr("系统"));model->setHeaderData(1, Qt::Horizontal, tr("描述"));model->setHeaderData(2, Qt::Horizontal, tr("时间"));model->setHeaderData(3, Qt::Horizontal, tr("操作者"));} else {model->setHeaderData(0, Qt::Horizontal, tr("描述"));model->setHeaderData(1, Qt::Horizontal, tr("时间"));model->setHeaderData(2, Qt::Horizontal, tr("操作者"));}HTTPQNetworkAccessManager *manager = new QNetworkAccessManager(this);connect(manager, &QNetworkAccessManager::finished,this, &MyClass::replyFinished);manager->get(QNetworkRequest(QUrl("")));QNetworkRequest request;request.setUrl(QUrl(""));request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");QNetworkReply *reply = manager->get(request);connect(reply, &QIODevice::readyRead, this, &MyClass::slotReadyRead);connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),this, &MyClass::slotError);connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);//使⽤accessManager = new new QNetworkAccessManager();//POSTvoid Common::post(const QString &url, const QString &data){QNetworkRequest request;request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");//request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());//request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());request.setUrl(QUrl(url));QByteArray postData;postData.append(data);QNetworkReply* reply = accessManager->post(request, postData);connect(reply, &QNetworkReply::finished, [this, reply, url]{emit getmessage(reply->readAll());reply->deleteLater();});}void Common::get(const QString &url){QNetworkRequest request;request.setUrl(QUrl(url));QNetworkReply* reply = accessManager->get(request);connect(reply, &QNetworkReply::finished, [this, reply, url]{QByteArray alldata = reply->readAll();emit getmessage(alldata);reply->deleteLater();});}//JOSNQMap<QString, QVariant> GFun::jsonParse(const QByteArray &jsonData){QJsonParseError jsonError;QJsonDocument doucment = QJsonDocument::fromJson(jsonData, &jsonError); // 转化为 JSON ⽂档if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { // 解析未发⽣错误if (doucment.isObject()) { // JSON ⽂档为对象QJsonObject object = doucment.object(); // 转化为对象return object.toVariantMap();}}QMap<QString, QVariant> data;return data;}TCP/UDPUDPvoid Server::initSocket(){udpSocket = new QUdpSocket(this);udpSocket->bind(QHostAddress::LocalHost, 7755);connect(udpSocket, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));}void Server::readPendingDatagrams(){while (udpSocket->hasPendingDatagrams()) {QNetworkDatagram datagram = udpSocket->receiveDatagram();processTheDatagram(datagram);}}192.168.1.255⼴播地址//服务端tcpServer = new QTcpServer(this);if (!tcpServer->listen(QHostAddress::Any, 1883)) {close();return;}connect(tcpServer, &QTcpServer::newConnection, this, &Server::sendFortune);connect(tcpServer, &QTcpServer::acceptError, this, [](QAbstractSocket::SocketError socketError){ });void Server::sendFortune(){QByteArray block;QDataStream out(&block, QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_10);out << fortunes[QRandomGenerator::global()->bounded(fortunes.size())];QTcpSocket *clientConnection = tcpServer->nextPendingConnection();connect(clientConnection, &QAbstractSocket::disconnected,clientConnection, &QObject::deleteLater);clientConnection->write(block);clientConnection->disconnectFromHost();}//客户端//初始化TCP客户端tcpClient = new QTcpSocket(this); //实例化tcpClienttcpClient->abort(); //取消原有连接connect(tcpClient, &QTcpSocket::readyRead, this, [tcpClient]{tcpClient->readAll();});connect(tcpClient, &QTcpSocket::connected, this, [tcpClient]{qDebug()<"连接成功";});connect(tcpClient, &QTcpSocket::disconnected, this, [tcpClient]{qDebug()<"断开连接";});connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), \this, SLOT(ReadError(QAbstractSocket::SocketError)));Signalsvoid connected()void disconnected()void error(QAbstractSocket::SocketError socketError)void hostFound()void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) void stateChanged(QAbstractSocket::SocketState socketState)disconnectFromHost 断开连接,等待缓冲区写⼊完成abort 直接断开,不等待进程和线程开启新的进程C++system();Qt// Qt5QString program = "C:/Windows/System32/cmd.exe";QStringList arguments;arguments << "/c" << "dir" << "C:\\";QProcess *cmdProcess = new QProcess; cmdProcess->start(program, arguments); QObject::connect(cmdProcess, &QProcess::readyRead, [=] () {QTextCodec *codec = QTextCodec::codecForName("GBK");QString dir = codec->toUnicode(cmdProcess->readAll());//线程 moveToThreadclass Worker : public QObject{Q_OBJECTpublic slots:void doWork(const QString ¶meter) {QString result;/* ... here is the expensive or blocking operation ... */emit resultReady(result);}signals:void resultReady(const QString &result);};class Controller : public QObject{Q_OBJECTQThread workerThread;public:Controller() {Worker *worker = new Worker;worker->moveToThread(&workerThread);connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);connect(this, &Controller::operate, worker, &Worker::doWork);connect(worker, &Worker::resultReady, this, &Controller::handleResults); workerThread.start();}~Controller() {workerThread.quit();workerThread.wait();}public slots:void handleResults(const QString &);signals:void operate(const QString &);};//线程 RUNclass WorkerThread : public QThread{Q_OBJECTvoid run() override {QString result;/* ... here is the expensive or blocking operation ... */emit resultReady(result);}signals:void resultReady(const QString &s);};void MyObject::startWorkInAThread(){WorkerThread *workerThread = new WorkerThread(this);connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults); connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater); workerThread->start();}QThread::idealThreadCount() //获取CPU数量//互斥锁QMutex mutex;int number = 6;void method1(){mutex.lock();number *= 5;number /= 4;mutex.unlock();}void method2(){mutex.lock();number *= 3;number /= 2;mutex.unlock();}//QMutexLocker 析构⾃动释放锁int complexFunction(int flag){QMutexLocker locker(&mutex);return 1;}//读写锁QReadWriteLock lock;void ReaderThread::run(){...lock.lockForRead();read_file();lock.unlock();...}void WriterThread::run(){...lock.lockForWrite();write_file();lock.unlock();...}//信号量QSemaphore sem(5); // sem.available() == 5sem.acquire(3); // sem.available() == 2sem.acquire(2); // sem.available() == 0sem.release(5); // sem.available() == 5sem.release(5); // sem.available() == 10sem.tryAcquire(1); // sem.available() == 9, returns truesem.tryAcquire(250); // sem.available() == 9, returns false//条件变量forever {mutex.lock();keyPressed.wait(&mutex);do_something();mutex.unlock();}forever {getchar();keyPressed.wakeAll();}QAtomicIntQAtomicPointer资源⽂件资源⽂件以 .qrc结尾在c++中使⽤资源⽂件路径 :/image/a.pngqml使⽤资源⽂件 qrc:/Button.qml.pro中执⾏qmake编译资源⽂件system($$[QT_INSTALL_BINS]/rcc.exe -binary $$PWD/res.qrc -o $$PWD/myresource.rcc)再main中QResource::registerResource("./myresource.rcc");c++11c++11⽀持,在.pro中增加 CONFIG += c++11constexpr ⽤于向编译器指出,函数或变量在编译时运算。
C++ Qt5 范例开发大全

4
C++ Qt5 范例开发大全
1.9 图片中加文字 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 84 1.10 图像扭曲 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 85 1.11 模糊效果 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 85 1.12 着色效果 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 86 1.13 阴影效果 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 87 1.14 透明效果 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 87 第7章 多媒体应用 1.1 音频、视频播放器 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 90 1.2 播放 Flash 动画 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 94 1.3 播放图片动画 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 95 第8章 系统操作 1.1 获取屏幕分辨率 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 98 1.2 获取本机名、IP 地址 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 98 1.3 根据网址获取 IP 地址 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 99 1.4 判断键盘按下键值 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 100 1.5 获取系统环境变量 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 101 1.6 执行系统命令 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 102 第9章 注册表 1.0 简要说明注册表 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 105 1.1 写入注册表 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 105 1.2 查找注册表 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 106 1.3 修改 IE 浏览器的默认主页 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 107 第10章 数据库基础 1.1 查询数据库驱动 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 109
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt中的多线程编程
在同一个窗口上每隔半秒交替显示动态正 弦波和动态三角波。
QThread 类是最重要的Qt 线程类,提供了 与系统无关的线程。用户可以通过它创建 新线程。QThread 代表在程序中一个单独 的线程控制,在多任务操作系统中,它和 同一进程中的其它线程共享数据,但运行 起来就像一个单独的程序一样。
drawdemo.cpp:
#define PI 3.1415926 #include <stdio.h> #include "drawdemo.h" DrawDemo::DrawDemo( QWidget *parent, const char *name ) :QWidget( parent, name ) { setCaption( "OURS_qt_Example" ); frame = new QFrame( this, "frame" ); frame->setBackgroundColor( black ); frame->setGeometry( QRect( 40, 40, 402, 252 ) ); for( int i=0; i<200; i++ ) { buffer[i] = ( int )( sin( (i*PI) /100 ) * 100 ); }
for( int i=0; i<199; i++ ) { beginPoint.setX( 2*i ); beginPoint.setY( buffer[i] +125 ); endPoint.setX( 2*i+1 ); endPoint.setY( buffer[i+1] +125 ); painter.drawLine( beginPoint, endPoint ); } }
int main() { MyThread a; MyThread b; a.start(); b.start(); a.wait(); b.wait(); }
这将会开始两个线程,每个线程在屏幕上 写20 次“Ping!”并且退出。
本实验以TriThread 类来实现三角波,以 SinThread来实现正弦波。 在两个类的实现过程中,基本类似,这里 以TriThread 来进行阐述。 在TriThread 类的声明中,除了继承了 QWidget 类之外,也继承了QThread 类。 使得画图的同时本身也是一个线程。
本例中的绘制代码
QPoint beginPoint; QPoint endPoint; //定义了两个点,分别代表着画图的起始点和结束点。 painter.setPen( blue ); //设置画笔的颜色为blue。 for( int i=0; i<199; i++ ) { beginPoint.setX( 2*i ); //乘2是为了”拉长”曲线. beginPoint.setY( buffer[i] +125 ); endPoint.setX( 2*i+1 ); endPoint.setY( buffer[i+1] +125 ); painter.drawLine( beginPoint, endPoint ); }
class TriThread: public QWidget, public QThread { Q_OBJECT public: TriThread( QWidget *parent=0, const char *name=0, QFrame *f=NULL ); ……
Qt编程例子
----绘图、多线程、网络编程
实验八 Qt 中的绘图
实现正弦曲线移动的效果
QFrame 类是有框架的窗口部件的基类。 它绘制框架并且调用一个虚函数 drawContents()来填充这个框架。 QFrame 类也能够直接被用来创建没有任 何内容的简单框架,
frame = new QFrame( this, "frame" ); frame->setBackgroundColor( black ); frame->setGeometry( QRect( 40, 40, 402, 252 ) );
它不是在main()中开始,QThread是在run()中开始运行的。 你继承run()并且在其中包含你的代码。例如:
class MyThread : public QThread { public: virtual void run(); }; void MyThread::run() { for( int count = 0; count < 20; count++ ) { sleep( 1 ); qDebug( "Ping!" ); } }
repaint 函数
void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘制窗口部件,除 非更新是失效的或者窗口部件被隐藏。如果erase为真, Qt在paintEvent()调用之前擦除区域(x,y,w,h)。 当某个窗口或者部件接收到了“重画”的消息时,它便使 用paintEvent()函数画图,而 我们画图的基本方法就是重载QWidget 的虚方法 paintEvent()。当然,这个只能针对QWidget 的派生类。
void SimpleExampleWidget::paintEvent() { QPainter paint( this ); paint.setPen( Qt::blue ); paint.drawText( rect(), AlignCenter, “The Text” );//在矩形中绘制文本 }
使用方法很简单并且这里有你可以使用的许多 设置: font()是当前设置的字体 brush()是当前设置的画刷,用来填充例如圆 的颜色或者调色板。 pen()是当前设置的画笔,用来画线或者边缘 的颜色或者点画。 pos()是当前位置,通过moveTo()设置并且 通过lineTo()使用。
QTimer类
QTimer 类是Qt 中关于定时器的一个类, 它提供了定时器信号和单触发定时器。 它在内部使用定时器事件来提供更通用 的定时器(关于定时器事件,请参照: QTimerEvent)。QTimer很容易使用:创 建一个QTimer,使用start()来开始并且把 它的timeout()连接到适当的槽。当这段时 间过去了,它将会发射timeoutclude <qapplication.h> #include "drawdemo.h" int main( int argc, char **argv ) { QApplication app( argc, argv ); DrawDemo *drawdemo = new DrawDemo( 0 ); drawdemo->setGeometry(10, 20, 480, 320 ); app.setMainWidget( drawdemo ); drawdemo->show(); int result = app.exec(); return result; }
QTimer *timer = new QTimer( this, "timer" ); connect( timer, SIGNAL( timeout() ), this, SLOT( flushBuff() ) ); timer->start( 30 ); }
void DrawDemo::flushBuff() { int tmp = buffer[0]; int i; for( i=0; i<200; i++ ) { buffer[i] = buffer[i+1]; } buffer[199] = tmp; repaint( 0, 0, 480, 320, TRUE ); } void DrawDemo::paintEvent( QPaintEvent * ) { frame->erase( 0, 0, 400, 320 ); QPainter painter( frame ); QPoint beginPoint; QPoint endPoint; painter.setPen( blue );
注意当QTimer 的父对象被销毁时,它也会被 自动销毁。实例:
QTimer *timer = new QTimer( myObject ); connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) ); timer->start( 2000, TRUE ); // 2 秒单触发定时器
QPainter 的核心功能是绘制,并且这 里有最简单的绘制函数:
������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ drawPoint():绘制单一的一个点 drawPoints():绘制一组点 drawLine():绘制一条直线 drawRect():绘制一个矩形 drawWinFocusRect():绘制一个窗口焦点矩形 drawRoundRect():绘制一个原形矩形 drawEllipse():绘制一个椭圆 drawArc():绘制一个弧 drawPie():绘制一个饼图 drawChord():绘制一条弦 drawLineSegments():绘制n 条分隔线 drawPolyline():绘制由n 个点组成的多边形 drawPolygon():绘制由n 个点组成的多边形 drawConvexPolygon():绘制由n 个点组成的凸多边形 drawCubicBezier():绘制三次贝塞尔曲线