商道如狼道 发表于 2024-2-27 20:14:12

C++系列三:QT代码库

目录

[*]前言
[*]QT

[*]小记
[*]1. 菜单栏、工具栏、状态栏
[*]2. 自定义的对话框
[*]3. 任务管理器
[*]4. 链接数据库mysql,sqlite
[*]5. Widgets Gallery Example代码学习:
[*]999.Controls

[*]QT-For-Python

[*]1. Demo

[*]QT-Quick

[*]1. HelloWorld
[*]2. 简单表单


前言

记录有关qt的案例。
QT

小记

知识点:
1. ui_widget.h:类的名称是Ui_widget.h,根据组件、信号与信号槽自动生成。
2. 数学运算函数在 <QtMath> 头文件中定义
3. 消息显示: qDebug,qWarning、qCritical、qFatal、qInfo
4. 全局宏:QT_VERSION、QT_VERSION_STR、
5. 容器:QList、QStack和QQueue;QMap、QMultiMap、QHash、QMultiHash和QSet。
6. QGridLayout类添加组件的函数是addWidget():
7. QAbstractButton的autoExclusive属性:如果启用了自动独占性,属于同一个父部件的可检查按钮将互斥。
8. QGroupBox的flat属性:可以最小化区域框的空间消耗。在大多数样式中,启用这个属性会移除框架的左边缘、右边缘和底边。
9. Sql模块对Cmake文件添加: find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED)
在target_link_libraries中添加Qt${QT_VERSION_MAJOR}::Sql



代码:
1. 编码格式
#include <QTextCodec>//添加头文件
QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //设置编码
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));

2. tr()函数 =>随国际化变化。ui->pushButton->setText(tr("新窗口"));

4. 常用控件属性设置:
if(ui->usrLineEdit->text().trimmed() == tr("admin")&& ui->pwdLineEdit->text() == tr("123456"))
QLabel *lab; //声明
this->lab=new QLabel("hello,world",this);
ui->firstBtn->setText("新窗口");
QMessageBox::warning(this, tr("Waring"),tr("error!"), QMessageBox::Yes);                     
ui->pwdLineEdit->clear();
ui->usrLineEdit->setFocus();

5. 菜单设置:
// 创建新的动作 添加图标 设置快捷键
QAction *openAction = new QAction(tr("&Open"), this);
QIcon icon(":/myImages/images/close.png");
openAction->setIcon(icon);
openAction->setShortcut(QKeySequence(tr("Ctrl+O")));
ui->menu_F->addAction(openAction);

6. 其他:
//记事本打开myResources.qrc //文件(&F)
//添加资源文件=>/myImages=>images=>需要的图标文件粘贴进去=>可以别名
是一个XML文档
表明将菜单的快捷键设置为了Alt+ F
icon(":/myImages/close");

7. qDebug("111"+str); qDebug()<<"111";

8. //设置粗体,斜体,下划线 设置字体颜色:
QFont font=ui->plainTextEdit->font();
font.setBold(checked);//font.setItalic(checked);font.setUnderline(checked);
ui->plainTextEdit->setFont(font);
QPalette plet=ui->plainTextEdit->palette();
if(ui->radioButton_black->isChecked())
    plet.setColor(QPalette::Text,Qt::black);
if(ui->radioButton_blue->isChecked())
    plet.setColor(QPalette::Text,Qt::blue);
if(ui->radioButton_red->isChecked())
    plet.setColor(QPalette::Text,Qt::red);
ui->plainTextEdit->setPalette(plet);
QPushButton btn("button");
QObject::connect(&btn,&QPushButton::clicked,&QApplication::quit);
QObject::connect(&btn,&QPushButton::clicked,[](bool) {
      qDebug() << "You clicked me!";
    });
btn.show();

9. Q_UNUSED(name)//这个宏用于在函数中定义不在函数体里使用的参数
void MainWindow::on_imageSaved(int id, const QString &fileName)
{ Q_UNUSED(id);
LabInfo->setText ("图片保存为:"+ fileName);}

10. 布局分布管理 stretch
layoutStretch:0,0,0,表示3个组件平均分配宽度
layoutStretch:0,0,1,表示前两个组件达到合适宽度后不再增加宽度,其余的空间都分配给第三个组件
layoutStretch:1,1,2,表示前两个组件达到合适宽度后将尽量满足1:1:2的比例

11. 分割条允许用户通过拖动子widget之间的边界来控制子widget的大小。
QSplitter *splitter = new QSplitter(parent);
QListView *listview = new QListView;
QTreeView *treeview = new QTreeView;
QTextEdit *textedit = new QTextEdit;
splitter->addWidget(listview);
splitter->addWidget(treeview);
splitter->addWidget(textedit);
//splitter->setOrientation(Qt::Vertical);

12. foreach
QList<QString> values;
foreach (QString str, values)
    qDebug() << str;

13.
// 移除帮助按钮。windowFlags() 当前窗口的标志位(flags)、取反,按位与运算
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
//用户使用键盘快捷键时,可以通过按下 "Alt + S" 来聚焦到 styleComboBox。
auto styleLabel = createWidget1<QLabel>(tr("&Style:"), "styleLabel");
styleLabel->setBuddy(styleComboBox);
//全局快捷键:
new QShortcut(tr("Ctrl+p"), this, this, &WidgetGallery::demo);
demo是一个信号
//参数带入,版本宏
setWindowTitle(tr("Widget Gallery Qt %1").arg(QT_VERSION_STR));
qDebug() << "Qt version: " << QT_VERSION;
qDebug() << "Qt major version: " << QT_VERSION_MAJOR;
qDebug() << "Qt minor version: " << QT_VERSION_MINOR;
qDebug() << "Qt patch version: " << QT_VERSION_PATCH;


999. QMetaObject类
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    //QObject::metaObject返回类关联的元对象
    QObject *btn = new QPushButton;
    qDebug()<<btn->metaObject()->className(); //返回“QPushButton”
    QPushButton *btnPush=qobject_cast<QPushButton*>(btn);//qobject_cast类似于标准C++中的dynamic_cast
    qDebug()<<btnPush->metaObject()->className();
    QTimer *timer = new QTimer();               //QTimer是QObject的子类
    qDebug()<<timer->inherits("QTimer");      //返回true
    qDebug()<<timer->inherits("QObject");       //返回true
    qDebug()<<timer->inherits("QAbstrctButton");//返回false
    //superClass返回父类的元对象
    qDebug()<<btn->metaObject()->superClass()->className();
}
1000:属性系统:
Q_PROPERTY(bool focus READ hasFocus)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
Q_PROPERTY(QCursor cursor READ cursor WRITE SetCursor RESET unsetCursor)
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPushButton *button = new QPushButton;
    QObject *object = button;
    bool isFlat = object->property("flateee").toBool();
    qDebug()<<isFlat;
    object->setProperty("flateee",true);
    isFlat = object->property("flateee").toBool();
    qDebug()<<isFlat;
    const QMetaObject *meta=object->metaObject();
    int index=meta->indexOfProperty("down");
    QMetaProperty prop=meta->property(index);
    bool res=prop.isWritable();
    qDebug()<<" down(QPushButton) isWritable?: "<<res;
}
1001:类的附加信息
Q_OBJECT
Q_CLASSINFO("author","Wang")
Q_CLASSINFO("compay","UPC")
Q_CLASSINFO("version","3.0.1")

QMyWidget * myWidget = new QMyWidget;
qDebug()<<myWidget->metaObject()->classInfo(0).name();
qDebug()<<myWidget->metaObject()->classInfo(0).value();
qDebug()<<myWidget->metaObject()->classInfo(1).name();
qDebug()<<myWidget->metaObject()->classInfo(1).value();
1002. 自定义信号及其使用:
class QPerson:public QObject
{
Q_OBJECT
private:
int m_age = 10;
public:
void incAge();
signals:
void ageChanged(int value);
};
void QPerson::incAge() { m_age++; emit ageChanged(m_age); //发射信号
1003:容器:
QList<float> list; //定义一个float类型的数据列表
QList<int> list={1,2,3,4,5};//初始化列表数据
QList<int> list(100); //初始化列表元素个数为100,所有元素默认为0
QList<QString> strList(10,"pass");//10个元素,每个元素都被初始化为pass
QList<QString> list;
list<<"Monday"<<"Tuesday"<<"Wednesday"<<"Thursday";
list.append("Friday");
QString str1=list;              //QList::const_reference QList::operator[](qsizetype i) const
QString str2=list.at(1);
//------------
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7
map.insert("twelve", 12);
int num1 = map["one"];
//如果在map中没有指定键的项,这些函数返回一个默认构造的值。
int num2 = map["thirteen"];
int num3 = map.value("thirteen");
//还有一个value()重载方法,如果指定的键不存在,则使用第二个参数作为默认值
int num4 = map.value("thirteen",13);https://img2023.cnblogs.com/blog/2422527/202311/2422527-20231122105810974-1296831549.png
3. 任务管理器

QApplication a(argc, argv);
MainWindow mainWindow;
// 创建菜单栏
QMenuBar *menuBar = mainWindow.menuBar();
QMenu *fileMenu = menuBar->addMenu("文件");
QMenu *editMenu = menuBar->addMenu("编辑");
// 创建工具栏
QToolBar *toolBar = mainWindow.addToolBar("工具栏");
toolBar->addAction("打开");
toolBar->addAction("保存");
toolBar->addSeparator();
toolBar->addAction("剪切");
toolBar->addAction("复制");
toolBar->addAction("粘贴");
// 创建状态栏
QStatusBar *statusBar = mainWindow.statusBar();
statusBar->showMessage("准备就绪");
mainWindow.setGeometry(100, 100, 800, 600); // 设置主窗口的位置和大小
mainWindow.setWindowTitle("Qt 示例应用程序");
mainWindow.show();https://img2023.cnblogs.com/blog/2422527/202311/2422527-20231122105956384-272646654.png
4. 链接数据库mysql,sqlite

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QTextEdit>
#include <QStatusBar>
#include <QMessageBox>
#include <QInputDialog>
#include <QLabel>
#include <QPushButton>
#include <QFile>
#include <QVBoxLayout>
#include <QFileDialog>

class CustomDialog : public QDialog
{
public:
    CustomDialog(QWidget *parent = nullptr)
      : QDialog(parent)
    {
      setWindowTitle("自定义对话框");

      QLabel *label = new QLabel("请输入文本:", this);
      lineEdit = new QLineEdit(this);
      QPushButton *okButton = new QPushButton("确定", this);
      QPushButton *cancelButton = new QPushButton("取消", this);

      QVBoxLayout *layout = new QVBoxLayout;
      layout->addWidget(label);
      layout->addWidget(lineEdit);
      layout->addWidget(okButton);
      layout->addWidget(cancelButton);
      setLayout(layout);

      connect(okButton, &QPushButton::clicked, this, &CustomDialog::accept);
      connect(cancelButton, &QPushButton::clicked, this, &CustomDialog::reject);
    }

    QString getText() const
    {
      return lineEdit->text();
    }

private:
    QLineEdit *lineEdit;
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow mainWindow;

    QMenuBar *menuBar = mainWindow.menuBar();
    QMenu *fileMenu = menuBar->addMenu("文件");
    QMenu *editMenu = menuBar->addMenu("编辑");

    QToolBar *toolBar = mainWindow.addToolBar("工具栏");

    QTextEdit *textEdit = new QTextEdit(&mainWindow);
    mainWindow.setCentralWidget(textEdit);

    QStatusBar *statusBar = mainWindow.statusBar();

    // 在菜单栏和工具栏中添加操作
    QAction *openAction = fileMenu->addAction("打开");
    QAction *saveAction = fileMenu->addAction("保存");
    fileMenu->addSeparator();
    QAction *customDialogAction = editMenu->addAction("自定义对话框");

    toolBar->addAction(openAction);
    toolBar->addAction(saveAction);
    toolBar->addSeparator();
    toolBar->addAction(customDialogAction);

    QObject::connect(openAction, &QAction::triggered, [&]() {
      QString fileName = QFileDialog::getOpenFileName(&mainWindow, "打开文件");
      if (!fileName.isEmpty()) {
            QFile file(fileName);
            if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                textEdit->setPlainText(file.readAll());
                file.close();
            }
      }
    });

    QObject::connect(saveAction, &QAction::triggered, [&]() {
      QString fileName = QFileDialog::getSaveFileName(&mainWindow, "保存文件");
      if (!fileName.isEmpty()) {
            QFile file(fileName);
            if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
                QTextStream out(&file);
                out << textEdit->toPlainText();
                file.close();
            }
      }
    });

    QObject::connect(customDialogAction, &QAction::triggered, [&]() {
      CustomDialog dialog(&mainWindow);
      if (dialog.exec() == QDialog::Accepted) {
            QString text = dialog.getText();
            if (!text.isEmpty()) {
                statusBar->showMessage("自定义对话框输入: " + text, 5000);
            }
      }
    });
    mainWindow.setGeometry(100, 100, 800, 600);
    mainWindow.setWindowTitle("高级 Qt 示例");
    mainWindow.show();
    return app.exec();
}QT-For-Python

1. Demo

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QInputDialog>

class TaskManager : public QMainWindow
{
    Q_OBJECT

public:
    TaskManager(QWidget *parent = nullptr)
      : QMainWindow(parent)
    {
      setWindowTitle("任务管理器");

      taskList = new QListWidget(this);
      setCentralWidget(taskList);

      createMenus();
    }

private:
    QListWidget *taskList;

    void createMenus()
    {
      QMenu *taskMenu = menuBar()->addMenu("任务");

      QAction *addAction = taskMenu->addAction("添加任务");
      connect(addAction, &QAction::triggered, this, &TaskManager::addTask);

      QAction *removeAction = taskMenu->addAction("删除任务");
      connect(removeAction, &QAction::triggered, this, &TaskManager::removeTask);

      QAction *completeAction = taskMenu->addAction("完成任务");
      connect(completeAction, &QAction::triggered, this, &TaskManager::completeTask);
    }

private slots:
    void addTask()
    {
      bool ok;
      QString taskName = QInputDialog::getText(this, "添加任务", "输入任务名称:", QLineEdit::Normal, "", &ok);

      if (ok && !taskName.isEmpty()) {
            taskList->addItem(taskName);
      }
    }

    void removeTask()
    {
      QListWidgetItem *selectedItem = taskList->currentItem();
      if (selectedItem) {
            delete selectedItem;
      }
    }

    void completeTask()
    {
      QListWidgetItem *selectedItem = taskList->currentItem();
      if (selectedItem) {
            selectedItem->setFlags(selectedItem->flags() | Qt::ItemIsUserCheckable);
            selectedItem->setCheckState(Qt::Checked);
      }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    TaskManager taskManager;
    taskManager.show();

    return app.exec();
}

#include "main.moc"// 使用Qt的元对象系统时需要的moc文件QT-Quick

1. HelloWorld

1. cmake:
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED)
target_link_libraries(20231121_C1 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)
2. 将本地的mysql:
D:\mysql-5.7.37-winx64\lib: libmysql.lib、libmysqld.lib 放置E:\QT\Qt4.6\6.5.2\msvc2019_64\bin目录下;
重启qt;
3.代码测试:
//代码:
#include "QtSql/qsqlquery.h"
#include <QCoreApplication>
#include <QtSql>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStringList drivers = QSqlDatabase::drivers();//获取现在可用的数据库驱动
    foreach(QString driver, drivers)
      qDebug() << driver;

    // 设置 SQLite 数据库连接
    // QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    //db.setDatabaseName("mydatabase.db");
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("mydata");
    db.setUserName("root");
    db.setPassword("123456");

    // 打开数据库
    if (!db.open()) {
      qDebug() << "无法打开数据库";
      return -1;
    }

//    // 在数据库中创建表
//    QSqlQuery query;
//    query.exec("CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, name TEXT)");

//    // 插入数据
//    query.prepare("INSERT INTO tasks (name) VALUES (:name)");
//    query.bindValue(":name", "完成 Qt 学习");
//    query.exec();

//    query.bindValue(":name", "写一个小程序");
//    query.exec();

    // 查询数据
    QSqlQuery query;
    query.exec("SELECT * FROM student");
    while (query.next()) {
      int id = query.value("id").toInt();
      QString name = query.value("name").toString();
      qDebug() << "任务 ID:" << id << ", 任务名称:" << name;
    }
    // 关闭数据库
    db.close();
    return a.exec();
}2. 简单表单

https://img2023.cnblogs.com/blog/2422527/202311/2422527-20231123103915384-249182877.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C++系列三:QT代码库