C++系列三:QT代碼庫

来源:https://www.cnblogs.com/zhouyitty/archive/2023/12/20/17916935.html
-Advertisement-
Play Games

目錄前言QT小記1. 菜單欄、工具欄、狀態欄2. 自定義的對話框3. 任務管理器4. 鏈接資料庫mysql,sqlite5. Widgets Gallery Example 代碼學習:999.ControlsQT-For-Python1. DemoQT-Quick1. HelloWorld2. 簡單 ...


目錄

前言

記錄有關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[0];        	//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);

1. 菜單欄、工具欄、狀態欄

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();

img

2. 自定義的對話框

#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();
}

img

3. 任務管理器

#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文件

img

4. 鏈接資料庫mysql,sqlite

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();
}

img



999.Controls

//QPushButton
QPushButton *button = new QPushButton("點擊我", &w); 
button.setText("Click me!");  
QObject::connect(&button, &QPushButton::clicked, [&](){  
    // button被點擊時執行的代碼  
    qDebug() << "Button clicked!";  
});  


//QToolButton
QWidget window;// 創建一個QWidget視窗
QVBoxLayout *layout = new QVBoxLayout(&window);// 創建一個垂直佈局管理器
// 創建一個QToolButton,並設置按鈕的圖標和文本
QToolButton *toolButton = new QToolButton;
toolButton->setIcon(QIcon(":/icon.png")); // 設置圖標
toolButton->setText("工具按鈕"); // 設置文本
layout->addWidget(toolButton);// 將QToolButton添加到佈局中
// 設置視窗的佈局
window.setLayout(layout);


//QRadioButton
QRadioButton *radioButton1 = new QRadioButton("選項 1");// 創建三個單選按鈕
QRadioButton *radioButton2 = new QRadioButton("選項 2");
QRadioButton *radioButton3 = new QRadioButton("選項 3");
// 將單選按鈕添加到佈局中
layout->addWidget(radioButton1);
layout->addWidget(radioButton2);
layout->addWidget(radioButton3);


//QCheckBox
QCheckBox *checkBox1 = new QCheckBox("選項 1");// 創建三個覆選框
QCheckBox *checkBox2 = new QCheckBox("選項 2");
QCheckBox *checkBox3 = new QCheckBox("選項 3");
// 將覆選框添加到佈局中
layout->addWidget(checkBox1);
layout->addWidget(checkBox2);
layout->addWidget(checkBox3);



//QListView
// 創建一個QStringListModel,用於存儲列表項的數據
QStringListModel *model = new QStringListModel;
// 添加一些示例數據
QStringList items;
items << "項1" << "項2" << "項3" << "項4" << "項5";
model->setStringList(items);
// 創建一個QListView並設置模型
QListView *listView = new QListView;
listView->setModel(model);


//QTreeView
// 創建一個QStandardItemModel,用於存儲樹形數據
QStandardItemModel *model = new QStandardItemModel;
// 創建一個根節點
QStandardItem *rootItem = model->invisibleRootItem();
// 創建一些子節點
QStandardItem *item1 = new QStandardItem("節點1");
QStandardItem *item2 = new QStandardItem("節點2");
QStandardItem *item3 = new QStandardItem("節點3");
// 將子節點添加到根節點
rootItem->appendRow(item1);
rootItem->appendRow(item2);
rootItem->appendRow(item3);
// 創建一個QTreeView並設置模型
QTreeView *treeView = new QTreeView;
treeView->setModel(model);


//QTableView
// 創建一個QStandardItemModel,用於存儲表格數據
QStandardItemModel *model = new QStandardItemModel;
// 設置表頭
model->setHorizontalHeaderLabels({"列1", "列2", "列3"});
// 插入一些數據
for (int row = 0; row < 5; ++row) {
    for (int column = 0; column < 3; ++column) {
        QModelIndex index = model->index(row, column, QModelIndex());
        model->setData(index, QString("行%1,列%2").arg(row + 1).arg(column + 1));
    }
}
// 創建一個QTableView並設置模型
QTableView *tableView = new QTableView;
tableView->setModel(model);


//QColumnView
// 創建一個QFileSystemModel,用於顯示文件系統
QFileSystemModel *model = new QFileSystemModel;
// 設置模型的根目錄,這裡設置為當前目錄
model->setRootPath(QDir::currentPath());
// 創建一個QColumnView並設置模型
QColumnView *columnView = new QColumnView;
columnView->setModel(model);


//QUndoView
用於顯示和管理撤銷/重做操作的控制項
// 創建一個QUndoStack來管理操作歷史記錄
QUndoStack undoStack;
// 創建一個QUndoView來顯示操作歷史記錄
QUndoView undoView(&undoStack);
undoView.setEmptyLabel("無可撤銷操作");
// 創建一個按鈕來執行一個示例操作
QPushButton button("執行操作");
QObject::connect(&button, &QPushButton::clicked, [&]() {
    // 在這裡執行一個示例操作,將其添加到撤銷堆棧中
    undoStack.push(new QUndoCommand("示例操作"));
});


//QListWidget
// 創建一個QListWidget
QListWidget *listWidget = new QListWidget;
// 創建一些示例列表項
QListWidgetItem *item1 = new QListWidgetItem("項目1");
QListWidgetItem *item2 = new QListWidgetItem("項目2");
QListWidgetItem *item3 = new QListWidgetItem("項目3");
// 將列表項添加到QListWidget
listWidget->addItem(item1);
listWidget->addItem(item2);
listWidget->addItem(item3);


//QTreeWidget
// 創建一個QTreeWidget,用於顯示樹形數據
QTreeWidget *treeWidget = new QTreeWidget;
// 創建樹形控制項的列標題
QStringList headers;
headers << "列1" << "列2";
treeWidget->setHeaderLabels(headers);
// 創建根節點
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
rootItem->setText(0, "根節點");
// 創建一些子節點
QTreeWidgetItem *item1 = new QTreeWidgetItem(rootItem);
item1->setText(0, "子節點1");
item1->setText(1, "子節點1的列2");
QTreeWidgetItem *item2 = new QTreeWidgetItem(rootItem);
item2->setText(0, "子節點2");
item2->setText(1, "子節點2的列2");
// 將根節點添加到樹形控制項
treeWidget->addTopLevelItem(rootItem);


//QTableWidget
// 創建一個QTableWidget,用於顯示表格數據
QTableWidget *tableWidget = new QTableWidget;
// 設置表格的行數和列數
tableWidget->setRowCount(3); // 3行
tableWidget->setColumnCount(2); // 2列
// 設置表格的表頭
QStringList headers;
headers << "列1" << "列2";
tableWidget->setHorizontalHeaderLabels(headers);
// 在表格中插入一些數據
tableWidget->setItem(0, 0, new QTableWidgetItem("行1列1"));
tableWidget->setItem(0, 1, new QTableWidgetItem("行1列2"));
tableWidget->setItem(1, 0, new QTableWidgetItem("行2列1"));
tableWidget->setItem(1, 1, new QTableWidgetItem("行2列2"));
tableWidget->setItem(2, 0, new QTableWidgetItem("行3列1"));
tableWidget->setItem(2, 1, new QTableWidgetItem("行3列2"));


//QScrollArea
// 創建一個QScrollArea用於顯示滾動區域
QScrollArea *scrollArea = new QScrollArea;
// 創建一個大的QWidget,用於放置內容
QWidget *contentWidget = new QWidget;
// 創建一個垂直佈局管理器用於大的QWidget
QVBoxLayout *contentLayout = new QVBoxLayout(contentWidget);
// 向大的QWidget添加一些按鈕
for (int i = 0; i < 20; ++i) {
    QPushButton *button = new QPushButton("按鈕 " + QString::number(i + 1));
    contentLayout->addWidget(button);
}
// 設置大的QWidget為QScrollArea的視口
scrollArea->setWidget(contentWidget);

//QToolBox
// 創建一個QToolBox
QToolBox *toolBox = new QToolBox;
// 創建多個頁面並添加到QToolBox中
QWidget *page1 = new QWidget;
QPushButton *button1 = new QPushButton("按鈕 1");
page1->setLayout(new QVBoxLayout);
page1->layout()->addWidget(button1);
toolBox->addItem(page1, "頁面 1");
QWidget *page2 = new QWidget;
QLabel *label2 = new QLabel("標簽 2");
page2->setLayout(new QVBoxLayout);
page2->layout()->addWidget(label2);
toolBox->addItem(page2, "頁面 2");
QWidget *page3 = new QWidget;
QLabel *label3 = new QLabel("標簽 3");
page3->setLayout(new QVBoxLayout);
page3->layout()->addWidget(label3);
toolBox->addItem(page3, "頁面 3");


//QTabWidget
// 創建一個QTabWidget
QTabWidget *tabWidget = new QTabWidget;
// 創建多個選項卡頁面並添加到QTabWidget中
QWidget *page1 = new QWidget;
QPushButton *button1 = new QPushButton("按鈕 1");
page1->setLayout(new QVBoxLayout);
page1->layout()->addWidget(button1);
tabWidget->addTab(page1, "選項卡 1");
QWidget *page2 = new QWidget;
QLabel *label2 = new QLabel("標簽 2");
page2->setLayout(new QVBoxLayout);
page2->layout()->addWidget(label2);
tabWidget->addTab(page2, "選項卡 2");
QWidget *page3 = new QWidget;
QLabel *label3 = new QLabel("標簽 3");
page3->setLayout(new QVBoxLayout);
page3->layout()->addWidget(label3);
tabWidget->addTab(page3, "選項卡 3");


//QStackedWidget
// 創建一個QWidget視窗
QWidget window;
// 創建一個垂直佈局管理器
QVBoxLayout *layout = new QVBoxLayout(&window);
// 創建一個QStackedWidget
QStackedWidget *stackedWidget = new QStackedWidget;
// 創建多個頁面並添加到QStackedWidget中
QWidget *page1 = new QWidget;
QPushButton *button1 = new QPushButton("按鈕 1");
page1->setLayout(new QVBoxLayout);
page1->layout()->addWidget(button1);
stackedWidget->addWidget(page1);
QWidget *page2 = new QWidget;
QLabel *label2 = new QLabel("標簽 2");
page2->setLayout(new QVBoxLayout);
page2->layout()->addWidget(label2);
stackedWidget->addWidget(page2);
QWidget *page3 = new QWidget;
QLabel *label3 = new QLabel("標簽 3");
page3->setLayout(new QVBoxLayout);
page3->layout()->addWidget(label3);
stackedWidget->addWidget(page3);
// 設置預設顯示的頁面
stackedWidget->setCurrentIndex(0);
// 將QStackedWidget添加到佈局中
layout->addWidget(stackedWidget);
// 創建按鈕來切換頁面
QPushButton *nextButton = new QPushButton("下一頁");
layout->addWidget(nextButton);
// 設置視窗的佈局
window.setLayout(layout);
// 連接按鈕的點擊事件,用於切換頁面
QObject::connect(nextButton, &QPushButton::clicked, [&]() {
    int currentIndex = stackedWidget->currentIndex();
    int nextPageIndex = (currentIndex + 1) % stackedWidget->count();
    stackedWidget->setCurrentIndex(nextPageIndex);
});
// 設置視窗的大小
window.resize(300, 200);
// 顯示視窗
window.show();


//QFrame
// 創建一個QFrame
QFrame *frame = new QFrame;
// 設置QFrame的樣式,添加邊框
frame->setFrameStyle(QFrame::Panel | QFrame::Raised);
// 創建一些小部件並添加到QFrame中
QPushButton *button = new QPushButton("按鈕");
QLabel *label = new QLabel("標簽");
QVBoxLayout *frameLayout = new QVBoxLayout(frame);
frameLayout->addWidget(button);
frameLayout->addWidget(label);


//QComboBox
// 創建一個QComboBox
QComboBox *comboBox = new QComboBox;
// 向QComboBox添加選項
comboBox->addItem("選項 1");
comboBox->addItem("選項 2");
comboBox->addItem("選項 3");
// 將QComboBox添加到佈局中
layout->addWidget(comboBox);


//QFontComboBox
// 創建一個QWidget視窗
QWidget window;
// 創建一個垂直佈局管理器
QVBoxLayout *layout = new QVBoxLayout(&window);
// 創建一個QFontComboBox
QFontComboBox *fontComboBox = new QFontComboBox;
// 創建一個標簽來顯示所選字體示例
QLabel *label = new QLabel("示例文本");
label->setFont(fontComboBox->currentFont());
// 連接QFontComboBox的currentFontChanged信號以更新標簽的字體
QObject::connect(fontComboBox, &QFontComboBox::currentFontChanged, label, [=](const QFont &font) {
    label->setFont(font);
});
// 將QFontComboBox和標簽添加到佈局中
layout->addWidget(fontComboBox);
layout->addWidget(label);
// 設置視窗的佈局
window.setLayout(layout);
// 設置視窗的大小
window.resize(300, 200);
// 顯示視窗
window.show();


//QLineEdit
// 創建一個QLineEdit用於文本輸入
QLineEdit *lineEdit = new QLineEdit;
// 創建一個標簽來顯示輸入的文本
QLabel *label = new QLabel("輸入的文本:");
// 連接QLineEdit的textChanged信號以更新標簽的文本
QObject::connect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);
// 將QLineEdit和標簽添加到佈局中
layout->addWidget(lineEdit);
layout->addWidget(label);


//QTextEdit
// 創建一個QTextEdit用於多行文本輸入和編輯
QTextEdit *textEdit = new QTextEdit;


//QPlainTextEdit
// 創建一個QPlainTextEdit用於多行文本輸入和編輯
QPlainTextEdit *plainTextEdit = new QPlainTextEdit;


//QSpinBox
// 創建一個QSpinBox用於整數值輸入
QSpinBox *spinBox = new QSpinBox;
// 設置QSpinBox的範圍
spinBox->setMinimum(0);
spinBox->setMaximum(100);
// 創建一個標簽來顯示選擇的整數值
QLabel *label = new QLabel("選擇的值:");
// 連接QSpinBox的valueChanged信號以更新標簽的文本
QObject::connect(spinBox, QOverload<int>::of(&QSpinBox::valueChanged), [=](int value) {
    label->setText("選擇的值:" + QString::number(value));
});

QT-For-Python

1. Demo

self.ui.pushButton.setText("demo")
lable=QLabel("<font color=red size=40>Hello World!</font>")
lable.show()

Signals and Slots:
from PySide6.QtCore import Slot
@Slot()
def say_hello():
    print("button")
def function():
    print("button")
button = QPushButton("Click me")
button.clicked.connect(say_hello)//function
button.show()

QT-Quick

1. HelloWorld

//main.cpp:
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qt/qml/qtquickapplication1/main.qml")));
if (engine.rootObjects().isEmpty())
    return -1;

//main.qml:
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls
Window {
    visible: true
    width: 640
    height: 480
    title: "HelloWorld"
    Text:{
        text:"HelloWorld"
    }
}

2. 簡單表單

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

ApplicationWindow {
    visible: true
    width: 400
    height: 300
    title: "Qt Quick App"

    ColumnLayout {
        spacing: 10
        anchors.centerIn: parent

        TextField {
            id: nameField
            placeholderText: "Enter your name"
        }

        RowLayout {
            spacing: 10

            RadioButton {
                id: maleRadioButton
                text: "Male"
                checked: true
                onClicked: femaleRadioButton.checked = false
            }

            RadioButton {
                id: femaleRadioButton
                text: "Female"
                onClicked: maleRadioButton.checked = false
            }
        }

        ComboBox {
            id: countryComboBox
            model: ["Country 1", "Country 2", "Country 3"]
        }

        TextArea {
            id: commentsTextArea
            placeholderText: "Enter your comments"
            wrapMode: TextEdit.Wrap
            height: 100
        }

        Button {
            text: "Submit"
            font.pixelSize: 16
            Layout.columnSpan: 2
            Layout.fillWidth: true

            onClicked: {
                var nameValue = nameField.text
                var genderValue = maleRadioButton.checked ? "Male" : "Female"
                var countryValue = countryComboBox.currentText
                var commentsValue = commentsTextArea.text

                console.log("Name: " + nameValue)
                console.log("Gender: " + genderValue)
                console.log("Country: " + countryValue)
                console.log("Comments: " + commentsValue)

                // 在這裡可以將獲取到的值進行進一步處理或提交到伺服器
            }
        }
    }
}

img


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著業務需求猛增、各種AB場景線上測試,交互複雜度提升,所以對門詳的整體交互體驗,小程式載入速度、列表的滾動性能以及業務數據層面都有更高的要求,因此作為前端研發團隊,我們也迎來了一些新的挑戰。 ...
  • 一、CSS 1.說一下CSS的盒模型。 在HTML頁面中的所有元素都可以看成是一個盒子 盒子的組成:內容content、內邊距padding、邊框border、外邊距margin 盒模型的類型: 標準盒模型 margin + border + padding + content IE盒模型 marg ...
  • Flat 線上教室 —— 個人老師可直接使用的線上授課軟體,開箱即用。前後端完全開源,快速搭建簡約美觀的線上教室。支持 Web 端、Windows 客戶端與 macOS 客戶端。 ...
  • 前言 經過上個章節的介紹,大家可以瞭解到 uni-app-pinia存儲數據的基本使用方法 那本章節來給大家介紹一下 uni-app-網路請求 的基本使用方法 步入正題 首先我們打開官方文檔,我先帶著大家看一下官方文檔的介紹:https://uniapp.dcloud.net.cn/api/requ ...
  • 隨著人工智慧技術的不斷發展,阿裡體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓雲上運動會、線上運動會、健身打卡、AI體育指導等概念空前火熱。那麼,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本系列文章將使 ...
  • 這章內容詳細地介紹了文件上傳和下載的實現過程。文件上傳涉及前端頁面、Controller 方法和配置修改,其中前端頁面通過表單的提交方式和enctype屬性設置來實現文件上傳,而後端的 Controller 方法則通過接收 MultipartFile 類型的參數來處理上傳的文件,並將文件保存到伺服器... ...
  • C 語言中的運算符 運算符用於對變數和值進行操作。 在下麵的示例中,我們使用 + 運算符將兩個值相加: int myNum = 100 + 50; 雖然 + 運算符通常用於將兩個值相加,就像上面的示例一樣,它還可以用於將變數和值相加,或者將變數和另一個變數相加: int sum1 = 100 + 5 ...
  • Redis 全文搜索是依賴於 Redis 官方提供的 RediSearch 來實現的。RediSearch 提供了一種簡單快速的方法對 hash 或者 json 類型數據的任何欄位建立二級索引,然後就可以對被索引的 hash 或者 json 類型數據欄位進行搜索和聚合操作。 這裡我們把被索引的 ha ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...