C++系列三:QT代码库

打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

目录

前言

记录有关qt的案例。
QT

小记
  1. 知识点:
  2. 1. ui_widget.h:类的名称是Ui_widget.h,根据组件、信号与信号槽自动生成。
  3. 2. 数学运算函数在 <QtMath> 头文件中定义
  4. 3. 消息显示: qDebug,qWarning、qCritical、qFatal、qInfo
  5. 4. 全局宏:QT_VERSION、QT_VERSION_STR、
  6. 5. 容器:QList、QStack和QQueue;QMap、QMultiMap、QHash、QMultiHash和QSet。
  7. 6. QGridLayout类添加组件的函数是addWidget():
  8. 7. QAbstractButton的autoExclusive属性:如果启用了自动独占性,属于同一个父部件的可检查按钮将互斥。
  9. 8. QGroupBox的flat属性:可以最小化区域框的空间消耗。在大多数样式中,启用这个属性会移除框架的左边缘、右边缘和底边。
  10. 9. Sql模块对Cmake文件添加: find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED)
  11. 在target_link_libraries中添加Qt${QT_VERSION_MAJOR}::Sql
  12. 代码:
  13. 1. 编码格式
  14. #include <QTextCodec>  //添加头文件
  15. QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //设置编码
  16. QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
  17. 2. tr()函数 =>随国际化变化。ui->pushButton->setText(tr("新窗口"));
  18. 4. 常用控件属性设置:
  19. if(ui->usrLineEdit->text().trimmed() == tr("admin")&& ui->pwdLineEdit->text() == tr("123456"))
  20. QLabel *lab; //声明
  21. this->lab=new QLabel("hello,world",this);
  22. ui->firstBtn->setText("新窗口");
  23. QMessageBox::warning(this, tr("Waring"),tr("error!"), QMessageBox::Yes);                     
  24. ui->pwdLineEdit->clear();
  25. ui->usrLineEdit->setFocus();
  26. 5. 菜单设置:
  27. // 创建新的动作 添加图标 设置快捷键
  28. QAction *openAction = new QAction(tr("&Open"), this);
  29. QIcon icon(":/myImages/images/close.png");
  30. openAction->setIcon(icon);
  31. openAction->setShortcut(QKeySequence(tr("Ctrl+O")));
  32. ui->menu_F->addAction(openAction);
  33. 6. 其他:
  34. //记事本打开myResources.qrc //文件(&F)
  35. //添加资源文件=>/myImages=>images=>需要的图标文件粘贴进去=>可以别名
  36. 是一个XML文档
  37. 表明将菜单的快捷键设置为了Alt+ F
  38. icon(":/myImages/close");
  39. 7. qDebug("111"+str); qDebug()<<"111";
  40. 8. //设置粗体,斜体,下划线 设置字体颜色:
  41. QFont font=ui->plainTextEdit->font();
  42. font.setBold(checked);//font.setItalic(checked);font.setUnderline(checked);
  43. ui->plainTextEdit->setFont(font);
  44. QPalette plet=ui->plainTextEdit->palette();
  45. if(ui->radioButton_black->isChecked())
  46.     plet.setColor(QPalette::Text,Qt::black);
  47. if(ui->radioButton_blue->isChecked())
  48.     plet.setColor(QPalette::Text,Qt::blue);
  49. if(ui->radioButton_red->isChecked())
  50.     plet.setColor(QPalette::Text,Qt::red);
  51. ui->plainTextEdit->setPalette(plet);
  52. QPushButton btn("button");
  53. QObject::connect(&btn,&QPushButton::clicked,&QApplication::quit);
  54. QObject::connect(&btn,&QPushButton::clicked,[](bool) {
  55.         qDebug() << "You clicked me!";
  56.     });
  57. btn.show();
  58. 9. Q_UNUSED(name)//这个宏用于在函数中定义不在函数体里使用的参数
  59. void MainWindow::on_imageSaved(int id, const QString &fileName)
  60. { Q_UNUSED(id);
  61. LabInfo->setText ("图片保存为:"+ fileName);}
  62. 10. 布局分布管理 stretch
  63. layoutStretch:0,0,0,表示3个组件平均分配宽度
  64. layoutStretch:0,0,1,表示前两个组件达到合适宽度后不再增加宽度,其余的空间都分配给第三个组件
  65. layoutStretch:1,1,2,表示前两个组件达到合适宽度后将尽量满足1:1:2的比例
  66. 11. 分割条允许用户通过拖动子widget之间的边界来控制子widget的大小。
  67. QSplitter *splitter = new QSplitter(parent);
  68. QListView *listview = new QListView;
  69. QTreeView *treeview = new QTreeView;
  70. QTextEdit *textedit = new QTextEdit;
  71. splitter->addWidget(listview);
  72. splitter->addWidget(treeview);
  73. splitter->addWidget(textedit);
  74. //splitter->setOrientation(Qt::Vertical);
  75. 12. foreach
  76. QList<QString> values;
  77. foreach (QString str, values)
  78.     qDebug() << str;
  79. 13.
  80. // 移除帮助按钮。windowFlags() 当前窗口的标志位(flags)、取反,按位与运算
  81. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  82. //用户使用键盘快捷键时,可以通过按下 "Alt + S" 来聚焦到 styleComboBox。
  83. auto styleLabel = createWidget1<QLabel>(tr("&Style:"), "styleLabel");
  84. styleLabel->setBuddy(styleComboBox);
  85. //全局快捷键:
  86. new QShortcut(tr("Ctrl+p"), this, this, &WidgetGallery::demo);
  87. demo是一个信号
  88. //参数带入,版本宏
  89. setWindowTitle(tr("Widget Gallery Qt %1").arg(QT_VERSION_STR));
  90. qDebug() << "Qt version: " << QT_VERSION;
  91. qDebug() << "Qt major version: " << QT_VERSION_MAJOR;
  92. qDebug() << "Qt minor version: " << QT_VERSION_MINOR;
  93. qDebug() << "Qt patch version: " << QT_VERSION_PATCH;
  94. 999. QMetaObject类
  95. int main(int argc, char *argv[]){
  96.     QApplication a(argc, argv);
  97.     //QObject::metaObject返回类关联的元对象
  98.     QObject *btn = new QPushButton;
  99.     qDebug()<<btn->metaObject()->className(); //返回“QPushButton”
  100.     QPushButton *btnPush=qobject_cast<QPushButton*>(btn);//qobject_cast类似于标准C++中的dynamic_cast
  101.     qDebug()<<btnPush->metaObject()->className();
  102.     QTimer *timer = new QTimer();               //QTimer是QObject的子类
  103.     qDebug()<<timer->inherits("QTimer");        //返回true
  104.     qDebug()<<timer->inherits("QObject");       //返回true
  105.     qDebug()<<timer->inherits("QAbstrctButton");//返回false
  106.     //superClass返回父类的元对象
  107.     qDebug()<<btn->metaObject()->superClass()->className();
  108. }
  109. 1000:属性系统:
  110. Q_PROPERTY(bool focus READ hasFocus)
  111. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
  112. Q_PROPERTY(QCursor cursor READ cursor WRITE SetCursor RESET unsetCursor)
  113. int main(int argc, char *argv[])
  114. {
  115.     QApplication a(argc, argv);
  116.     QPushButton *button = new QPushButton;
  117.     QObject *object = button;
  118.     bool isFlat = object->property("flateee").toBool();
  119.     qDebug()<<isFlat;
  120.     object->setProperty("flateee",true);
  121.     isFlat = object->property("flateee").toBool();
  122.     qDebug()<<isFlat;
  123.     const QMetaObject *meta=object->metaObject();
  124.     int index=meta->indexOfProperty("down");
  125.     QMetaProperty prop=meta->property(index);
  126.     bool res=prop.isWritable();
  127.     qDebug()<<" down(QPushButton) isWritable?: "<<res;
  128. }
  129. 1001:类的附加信息
  130. Q_OBJECT
  131. Q_CLASSINFO("author","Wang")
  132. Q_CLASSINFO("compay","UPC")
  133. Q_CLASSINFO("version","3.0.1")
  134. QMyWidget * myWidget = new QMyWidget;
  135. qDebug()<<myWidget->metaObject()->classInfo(0).name();
  136. qDebug()<<myWidget->metaObject()->classInfo(0).value();
  137. qDebug()<<myWidget->metaObject()->classInfo(1).name();
  138. qDebug()<<myWidget->metaObject()->classInfo(1).value();
  139. 1002. 自定义信号及其使用:
  140. class QPerson:public QObject
  141. {
  142. Q_OBJECT
  143. private:
  144. int m_age = 10;
  145. public:
  146. void incAge();
  147. signals:
  148. void ageChanged(int value);
  149. };
  150. void QPerson::incAge() { m_age++; emit ageChanged(m_age); //发射信号
  151. 1003:容器:
  152. QList<float> list; //定义一个float类型的数据列表
  153. QList<int> list={1,2,3,4,5};//初始化列表数据
  154. QList<int> list(100); //初始化列表元素个数为100,所有元素默认为0
  155. QList<QString> strList(10,"pass");//10个元素,每个元素都被初始化为pass
  156. QList<QString> list;
  157. list<<"Monday"<<"Tuesday"<<"Wednesday"<<"Thursday";
  158. list.append("Friday");
  159. QString str1=list[0];                //QList::const_reference QList::operator[](qsizetype i) const
  160. QString str2=list.at(1);  
  161. //------------
  162. QMap<QString, int> map;
  163. map["one"] = 1;
  164. map["three"] = 3;
  165. map["seven"] = 7
  166. map.insert("twelve", 12);
  167. int num1 = map["one"];
  168. //如果在map中没有指定键的项,这些函数返回一个默认构造的值。
  169. int num2 = map["thirteen"];
  170. int num3 = map.value("thirteen");
  171. //还有一个value()重载方法,如果指定的键不存在,则使用第二个参数作为默认值
  172. int num4 = map.value("thirteen",13);
复制代码

3. 任务管理器
  1. QApplication a(argc, argv);
  2. MainWindow mainWindow;
  3. // 创建菜单栏
  4. QMenuBar *menuBar = mainWindow.menuBar();
  5. QMenu *fileMenu = menuBar->addMenu("文件");
  6. QMenu *editMenu = menuBar->addMenu("编辑");
  7. // 创建工具栏
  8. QToolBar *toolBar = mainWindow.addToolBar("工具栏");
  9. toolBar->addAction("打开");
  10. toolBar->addAction("保存");
  11. toolBar->addSeparator();
  12. toolBar->addAction("剪切");
  13. toolBar->addAction("复制");
  14. toolBar->addAction("粘贴");
  15. // 创建状态栏
  16. QStatusBar *statusBar = mainWindow.statusBar();
  17. statusBar->showMessage("准备就绪");
  18. mainWindow.setGeometry(100, 100, 800, 600); // 设置主窗口的位置和大小
  19. mainWindow.setWindowTitle("Qt 示例应用程序");
  20. mainWindow.show();
复制代码

4. 链接数据库mysql,sqlite
  1. #include <QApplication>
  2. #include <QMainWindow>
  3. #include <QMenuBar>
  4. #include <QMenu>
  5. #include <QToolBar>
  6. #include <QTextEdit>
  7. #include <QStatusBar>
  8. #include <QMessageBox>
  9. #include <QInputDialog>
  10. #include <QLabel>
  11. #include <QPushButton>
  12. #include <QFile>
  13. #include <QVBoxLayout>
  14. #include <QFileDialog>
  15. class CustomDialog : public QDialog
  16. {
  17. public:
  18.     CustomDialog(QWidget *parent = nullptr)
  19.         : QDialog(parent)
  20.     {
  21.         setWindowTitle("自定义对话框");
  22.         QLabel *label = new QLabel("请输入文本:", this);
  23.         lineEdit = new QLineEdit(this);
  24.         QPushButton *okButton = new QPushButton("确定", this);
  25.         QPushButton *cancelButton = new QPushButton("取消", this);
  26.         QVBoxLayout *layout = new QVBoxLayout;
  27.         layout->addWidget(label);
  28.         layout->addWidget(lineEdit);
  29.         layout->addWidget(okButton);
  30.         layout->addWidget(cancelButton);
  31.         setLayout(layout);
  32.         connect(okButton, &QPushButton::clicked, this, &CustomDialog::accept);
  33.         connect(cancelButton, &QPushButton::clicked, this, &CustomDialog::reject);
  34.     }
  35.     QString getText() const
  36.     {
  37.         return lineEdit->text();
  38.     }
  39. private:
  40.     QLineEdit *lineEdit;
  41. };
  42. int main(int argc, char *argv[])
  43. {
  44.     QApplication app(argc, argv);
  45.     QMainWindow mainWindow;
  46.     QMenuBar *menuBar = mainWindow.menuBar();
  47.     QMenu *fileMenu = menuBar->addMenu("文件");
  48.     QMenu *editMenu = menuBar->addMenu("编辑");
  49.     QToolBar *toolBar = mainWindow.addToolBar("工具栏");
  50.     QTextEdit *textEdit = new QTextEdit(&mainWindow);
  51.     mainWindow.setCentralWidget(textEdit);
  52.     QStatusBar *statusBar = mainWindow.statusBar();
  53.     // 在菜单栏和工具栏中添加操作
  54.     QAction *openAction = fileMenu->addAction("打开");
  55.     QAction *saveAction = fileMenu->addAction("保存");
  56.     fileMenu->addSeparator();
  57.     QAction *customDialogAction = editMenu->addAction("自定义对话框");
  58.     toolBar->addAction(openAction);
  59.     toolBar->addAction(saveAction);
  60.     toolBar->addSeparator();
  61.     toolBar->addAction(customDialogAction);
  62.     QObject::connect(openAction, &QAction::triggered, [&]() {
  63.         QString fileName = QFileDialog::getOpenFileName(&mainWindow, "打开文件");
  64.         if (!fileName.isEmpty()) {
  65.             QFile file(fileName);
  66.             if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  67.                 textEdit->setPlainText(file.readAll());
  68.                 file.close();
  69.             }
  70.         }
  71.     });
  72.     QObject::connect(saveAction, &QAction::triggered, [&]() {
  73.         QString fileName = QFileDialog::getSaveFileName(&mainWindow, "保存文件");
  74.         if (!fileName.isEmpty()) {
  75.             QFile file(fileName);
  76.             if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
  77.                 QTextStream out(&file);
  78.                 out << textEdit->toPlainText();
  79.                 file.close();
  80.             }
  81.         }
  82.     });
  83.     QObject::connect(customDialogAction, &QAction::triggered, [&]() {
  84.         CustomDialog dialog(&mainWindow);
  85.         if (dialog.exec() == QDialog::Accepted) {
  86.             QString text = dialog.getText();
  87.             if (!text.isEmpty()) {
  88.                 statusBar->showMessage("自定义对话框输入: " + text, 5000);
  89.             }
  90.         }
  91.     });
  92.     mainWindow.setGeometry(100, 100, 800, 600);
  93.     mainWindow.setWindowTitle("高级 Qt 示例");
  94.     mainWindow.show();
  95.     return app.exec();
  96. }
复制代码
QT-For-Python

1. Demo
  1. #include <QApplication>
  2. #include <QMainWindow>
  3. #include <QListWidget>
  4. #include <QMenuBar>
  5. #include <QMenu>
  6. #include <QAction>
  7. #include <QInputDialog>
  8. class TaskManager : public QMainWindow
  9. {
  10.     Q_OBJECT
  11. public:
  12.     TaskManager(QWidget *parent = nullptr)
  13.         : QMainWindow(parent)
  14.     {
  15.         setWindowTitle("任务管理器");
  16.         taskList = new QListWidget(this);
  17.         setCentralWidget(taskList);
  18.         createMenus();
  19.     }
  20. private:
  21.     QListWidget *taskList;
  22.     void createMenus()
  23.     {
  24.         QMenu *taskMenu = menuBar()->addMenu("任务");
  25.         QAction *addAction = taskMenu->addAction("添加任务");
  26.         connect(addAction, &QAction::triggered, this, &TaskManager::addTask);
  27.         QAction *removeAction = taskMenu->addAction("删除任务");
  28.         connect(removeAction, &QAction::triggered, this, &TaskManager::removeTask);
  29.         QAction *completeAction = taskMenu->addAction("完成任务");
  30.         connect(completeAction, &QAction::triggered, this, &TaskManager::completeTask);
  31.     }
  32. private slots:
  33.     void addTask()
  34.     {
  35.         bool ok;
  36.         QString taskName = QInputDialog::getText(this, "添加任务", "输入任务名称:", QLineEdit::Normal, "", &ok);
  37.         if (ok && !taskName.isEmpty()) {
  38.             taskList->addItem(taskName);
  39.         }
  40.     }
  41.     void removeTask()
  42.     {
  43.         QListWidgetItem *selectedItem = taskList->currentItem();
  44.         if (selectedItem) {
  45.             delete selectedItem;
  46.         }
  47.     }
  48.     void completeTask()
  49.     {
  50.         QListWidgetItem *selectedItem = taskList->currentItem();
  51.         if (selectedItem) {
  52.             selectedItem->setFlags(selectedItem->flags() | Qt::ItemIsUserCheckable);
  53.             selectedItem->setCheckState(Qt::Checked);
  54.         }
  55.     }
  56. };
  57. int main(int argc, char *argv[])
  58. {
  59.     QApplication app(argc, argv);
  60.     TaskManager taskManager;
  61.     taskManager.show();
  62.     return app.exec();
  63. }
  64. #include "main.moc"  // 使用Qt的元对象系统时需要的moc文件
复制代码
QT-Quick

1. HelloWorld
  1. 1. cmake:
  2. find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED)
  3. target_link_libraries(20231121_C1 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)
  4. 2. 将本地的mysql:
  5. D:\mysql-5.7.37-winx64\lib: libmysql.lib、libmysqld.lib 放置E:\QT\Qt4.6\6.5.2\msvc2019_64\bin目录下;
  6. 重启qt;
  7. 3.代码测试:
  8. //代码:
  9. #include "QtSql/qsqlquery.h"
  10. #include <QCoreApplication>
  11. #include <QtSql>
  12. #include <QDebug>
  13. #include <QSqlDatabase>
  14. #include <QSqlQuery>
  15. int main(int argc, char *argv[])
  16. {
  17.     QCoreApplication a(argc, argv);
  18.     QStringList drivers = QSqlDatabase::drivers();  //获取现在可用的数据库驱动
  19.     foreach(QString driver, drivers)
  20.         qDebug() << driver;
  21.     // 设置 SQLite 数据库连接
  22.     // QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  23.     //db.setDatabaseName("mydatabase.db");
  24.     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  25.     db.setHostName("127.0.0.1");
  26.     db.setPort(3306);
  27.     db.setDatabaseName("mydata");
  28.     db.setUserName("root");
  29.     db.setPassword("123456");
  30.     // 打开数据库
  31.     if (!db.open()) {
  32.         qDebug() << "无法打开数据库";
  33.         return -1;
  34.     }
  35. //    // 在数据库中创建表
  36. //    QSqlQuery query;
  37. //    query.exec("CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, name TEXT)");
  38. //    // 插入数据
  39. //    query.prepare("INSERT INTO tasks (name) VALUES (:name)");
  40. //    query.bindValue(":name", "完成 Qt 学习");
  41. //    query.exec();
  42. //    query.bindValue(":name", "写一个小程序");
  43. //    query.exec();
  44.     // 查询数据
  45.     QSqlQuery query;
  46.     query.exec("SELECT * FROM student");
  47.     while (query.next()) {
  48.         int id = query.value("id").toInt();
  49.         QString name = query.value("name").toString();
  50.         qDebug() << "任务 ID:" << id << ", 任务名称:" << name;
  51.     }
  52.     // 关闭数据库
  53.     db.close();
  54.     return a.exec();
  55. }
复制代码
2. 简单表单

[code][/code]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表