Qt案例練習(有源碼)

項目源碼和資源:Qt案例練習: qt各種小案例練習,有完整資源和完整代碼

1.案例1?

?項目需求:中間為文本框,當點擊上面的復選框和單選按鈕時,文本框內的文本會進行相應的變化。

?代碼如下:

#include "dialog.h"
#include "ui_dialog.h"
#include<QMessageBox>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);QFont font=ui->textEdit->font();font.setPointSize(14);ui->textEdit->setFont(font);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_checkBoxUnderline_clicked(bool checked)
{//獲取文本的字體QFont font= ui->textEdit->font();font.setUnderline(checked);ui->textEdit->setFont(font);}void Dialog::on_checkBoxItalic_clicked(bool checked)
{//獲取文本的字體QFont font= ui->textEdit->font();font.setItalic(checked);ui->textEdit->setFont(font);
}void Dialog::on_checkBoxBold_clicked(bool checked)
{//獲取文本的字體QFont font= ui->textEdit->font();font.setBold(checked);ui->textEdit->setFont(font);
}void Dialog::on_radioButtonRed_clicked()
{//先獲取文本的調色板QPalette pal= ui->textEdit->palette();//void setColor(const QColor &color)//enum ColorRole { WindowText, Button, Light, Midlight, Dark, Mid,const QColor red(Qt::red);pal.setColor(QPalette::Text,red);ui->textEdit->setPalette(pal);}void Dialog::on_radioButtonBlue_clicked()
{//先獲取文本的調色板QPalette pal= ui->textEdit->palette();//void setColor(const QColor &color)//enum ColorRole { WindowText, Button, Light, Midlight, Dark, Mid,const QColor blue(Qt::blue);pal.setColor(QPalette::Text,blue);ui->textEdit->setPalette(pal);}void Dialog::on_radioButtonGreen_clicked()
{//先獲取文本的調色板QPalette pal= ui->textEdit->palette();//void setColor(const QColor &color)//enum ColorRole { WindowText, Button, Light, Midlight, Dark, Mid,const QColor green(Qt::green);pal.setColor(QPalette::Text,green);ui->textEdit->setPalette(pal);}void Dialog::on_pushButtonOk_clicked(bool checked)
{QMessageBox a;a.information(this,"提示","點擊了確定按鈕!!!");}void Dialog::on_pushButtonCancel_clicked()
{QMessageBox::information(this,"提示","點擊了取消按鈕!!!");
}void Dialog::on_pushButtonQuit_clicked()
{this->close();
}

?2.案例2

項目需求:完成上述的界面,中間是文本框,字體大小和字體都可以改變編輯框所有文字的樣式和大小,斜體,粗體,下劃線只能作用在光標選中的位置不是全部,當打開文件時,文件名會輸入在狀態欄的當前文件處,進度條顯示的字體大小的值。?

?代碼如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QLabel>
#include<QSpinBox>
#include<QProgressBar>
#include<QFontComboBox>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_actionNew_triggered();void on_actionOpen_triggered();void on_actionClear_triggered();void on_actionCut_triggered();void on_actionCopy_triggered();void on_actionPaste_triggered();void on_actionItalic_triggered(bool checked);void on_actionBold_triggered(bool checked);void on_actionUnderline_triggered(bool checked);//設置微調框的槽函數//void valueChanged(int);void on_spinBox_valueChanged(int value);//給字體框設置槽函數//void currentFontChanged(const QFont &f);void on_fontComboBox_currentFontChanged(const QFont &font);private:Ui::MainWindow *ui;QLabel *labelFilename;QLabel*labelWritesize;QSpinBox*Spinbox;//微調框//給微調框設置進度條QProgressBar*progressbar;//添加字體框QFontComboBox*fontComboBox;//字體框標簽QLabel*fontLable;private://界面初始化void InitUI();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QMessageBox>
#include<QFileDialog>
#include<stdio.h>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actionNew_triggered()
{QMessageBox::information(this,"提示","創建了新文件!!!");ui->textEdit->clear();
}void MainWindow::on_actionOpen_triggered()
{//調用打開文件對話框,并返回選擇的文件的文件名//static QString getOpenFileName(QWidget *parent = nullptr,//這個功能很強大QString filename=QFileDialog::getOpenFileName(this,"打開一個文件");QFile file(filename);// bool open(FILE *fh, QIODevice::OpenMode mode,//QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)if(file.open(QIODevice::ReadOnly | QIODevice::Text)){//打開文件成功QString readline;//存儲讀取一行的數據//對數據流進行操作要構建流//QTextStream(FILE *fileHandle, QIODevice::OpenModeQTextStream stream(&file);//bool atEnd() const;是否到底了while(!stream.atEnd()){readline=stream.readLine();//讀取一行//將這一行放到編輯器中ui->textEdit->append(readline);}//將文件名放到狀態欄中labelFilename->setText("當前文件:"+filename);QFont font;font.setPointSize(12);labelFilename->setFont(font);ui->statusbar->addWidget(labelFilename);}else{//打開文件失敗QMessageBox::information(this,"提示","文件打開失敗!!!");}}void MainWindow::on_actionClear_triggered()
{ui->textEdit->clear();
}void MainWindow::on_actionCut_triggered()
{ui->textEdit->cut();
}void MainWindow::on_actionCopy_triggered()
{ui->textEdit->copy();
}void MainWindow::on_actionPaste_triggered()
{ui->textEdit->paste();
}void MainWindow::on_actionItalic_triggered(bool checked)
{//這次不能直接對所有文本進行編輯,必須是選中那部分則哪部分發生變化//QTextCursor textCursor() const;//光標選中的文字
//    QTextCursor cursor=ui->textEdit->textCursor();
//    QString str= cursor.selectedText();QTextCharFormat current=ui->textEdit->currentCharFormat();//固定格式
//      QFont font;
//      font.setPointSize(ui->textEdit->font().pointSize());
//      font.setItalic(checked);
//      current.setFont(font);//方式二//inline void setFontWeight(int weight)current.setFontItalic(checked);//合并當前字體ui->textEdit->mergeCurrentCharFormat(current);}void MainWindow::on_actionBold_triggered(bool checked)
{auto current=ui->textEdit->currentCharFormat();QFont font;font.setPointSize(ui->textEdit->font().pointSize());font.setBold(checked);current.setFont(font);//合并字體ui->textEdit->mergeCurrentCharFormat(current);
}void MainWindow::on_actionUnderline_triggered(bool checked)
{auto current=ui->textEdit->currentCharFormat();current.setFontUnderline(checked);//合并當前字體ui->textEdit->mergeCurrentCharFormat(current);
}void MainWindow::on_spinBox_valueChanged(int value)
{//將文本框中的字體進行改變QFont font;font.setPointSize(value);ui->textEdit->setFont(font);//進度條跟著改變progressbar->setValue(value);
}void MainWindow::on_fontComboBox_currentFontChanged(const QFont &font)
{//設置編輯區里面的字體ui->textEdit->setFont(font);
}void MainWindow::InitUI()
{labelFilename=new QLabel;labelFilename->setText("當前文件:");QFont font;font.setPointSize(14);labelFilename->setFont(font);ui->statusbar->addWidget(labelFilename);//初始化字體標簽labelWritesize=new QLabel;labelWritesize->setText("字體大小");ui->toolBar->addWidget(labelWritesize);//設置微調框Spinbox=new QSpinBox;Spinbox->setMinimum(8);Spinbox->setMaximum(50);ui->toolBar->addWidget(Spinbox);//關聯微調框槽函數和信號connect(Spinbox,SIGNAL(valueChanged(int)),this,SLOT(on_spinBox_valueChanged(int)));//初始化進度條progressbar=new QProgressBar;//設置進度條的最大值progressbar->setMaximum(50);progressbar->setValue(10);ui->statusbar->addWidget(progressbar);//設置分隔符ui->toolBar->addSeparator();//字體框標簽fontLable=new QLabel;fontLable->setText("字體");ui->toolBar->addWidget(fontLable);//初始化字體框fontComboBox=new QFontComboBox;fontComboBox->setMinimumWidth(160);ui->toolBar->addWidget(fontComboBox);//關聯字體框和槽函數connect(fontComboBox,SIGNAL(currentFontChanged(const QFont )),this,SLOT(on_fontComboBox_currentFontChanged(const QFont)));}

問題1:mergeCurrentCharFormat合并字體以哪個字體為主

?"mergeCurrentCharFormat" 通常是指將當前選定的文本格式與新的格式進行合并,以確定最終應用于文本的格式。合并操作通常會保留當前文本的一些格式設置,同時應用新的格式設置。因此,可以說當前選定的字體格式將作為主要格式,在合并操作中起到關鍵作用。

問題2:?setFontWeight()如何使用

QFont font;
font.setWeight(QFont::Bold); // 設置字體為粗體// 將字體應用到控件上,比如QLabel
ui->label->setFont(font);

在上面的代碼中,QFont::Bold?是一個枚舉值,表示粗體字體。您可以根據需要使用不同的枚舉值來設置不同的字體粗細,比如QFont::Normal?表示正常字體。

問題3:?currentCharFormat()作用

在Qt中,currentCharFormat()?是 QTextEdit、QTextBrowser 等文本編輯控件中的一個函數,用于獲取當前光標位置或所選文本的字符格式。這個函數返回一個 QTextCharFormat 對象,該對象包含了當前文本的格式信息,如字體、顏色、粗細、斜體等。

問題4:c,c++,qt 分別如何讀取文件?

在C++中,可以使用fstream庫中的ifstream類來讀取文件。以下是一個簡單的示例代碼,演示如何打開一個文件并讀取其中的內容:

#include <iostream>
#include <fstream>int main() {std::ifstream file("example.txt");if (file.is_open()) {std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();} else {std::cout << "Unable to open file" << std::endl;}return 0;
}

在C語言中,可以使用stdio.h庫中的FILE結構體和相關函數來讀取文件。以下是一個簡單的示例代碼,演示如何打開一個文件并讀取其中的內容:

#include <stdio.h>int main() {FILE *file;char buffer[100];file = fopen("example.txt", "r");if (file == NULL) {printf("Unable to open file\n");return 1;}while (fgets(buffer, 100, file) != NULL) {printf("%s", buffer);}fclose(file);return 0;
}

在Qt中也可以使用C語言的方式來讀取文件,但通常推薦使用Qt提供的文件操作類來實現文件讀取操作,因為Qt的文件操作類更加方便、跨平臺,并且與Qt的信號槽機制結合更加靈活。

#include <QFile>
#include <QTextStream>
#include <QDebug>int main() {QFile file("example.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "Unable to open file";return 1;}QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();qDebug() << line;}file.close();return 0;
}

問題5:QtoolBar如何添加分隔符

要在QToolBar中添加分隔符,可以使用QToolBar的addSeparator()方法

3.案例3?

項目需求:上半部分可以輸入值進行計算,下班部分可以進行進制的轉換,注意可以設置一些提示信息,如果為空,提示后光標指定到要輸入的區域。?

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"
#include<QMessageBox>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButtonCount_clicked()
{//設置提示窗口if(ui->lineEditnumber->text().isEmpty()){QMessageBox::information(this,"提示","數量輸入值不能為空!!!");//將光標放到數量輸入編輯器中//ui->lineEditnumber->setCursorPosition(0);ui->lineEditnumber->setFocus();return;}else if(ui->lineEditsignal->text().isEmpty()){QMessageBox::information(this,"提示","單價輸入值不能為空!!!");//將光標放到單價輸入編輯器中//ui->lineEditnumber->setCursorPosition(0);ui->lineEditsignal->setFocus();return;}bool ret;int number=ui->lineEditnumber->text().toInt(&ret,10);double signal=ui->lineEditsignal->text().toDouble(&ret);double total=number*signal;QString strTotal=QString::asprintf("%0.2lf",total);ui->lineEdittotal->setText(strTotal);
}void Dialog::on_pushButton10_clicked()
{if(ui->lineEdit10->text().isEmpty()){QMessageBox::information(this,"提示","十進制輸入值不能為空!!!");ui->lineEdit10->setFocus();return;}bool ret;int number10=ui->lineEdit10->text().toInt(&ret,10);QString strnumber2=QString::number(number10,2);ui->lineEdit2_2->setText(strnumber2);QString strnumber16=QString::number(number10,16);ui->lineEdit16->setText(strnumber16);}void Dialog::on_pushButton2_clicked()
{if(ui->lineEdit2_2->text().isEmpty()){QMessageBox::information(this,"提示","二進制輸入值不能為空!!!");ui->lineEdit2_2->setFocus();return;}bool ret;int number2=ui->lineEdit2_2->text().toInt(&ret,2);QString strnumber10=QString::number(number2,10);ui->lineEdit10->setText(strnumber10);QString strnumber16=QString::number(number2,16);ui->lineEdit16->setText(strnumber16);}void Dialog::on_pushButton16_clicked()
{if(ui->lineEdit16->text().isEmpty()){QMessageBox::information(this,"提示","十六進制輸入值不能為空!!!");ui->lineEdit16->setFocus();return;}bool ret;int number16=ui->lineEdit16->text().toInt(&ret,16);QString strnumber10=QString::number(number16,10);ui->lineEdit10->setText(strnumber10);QString strnumber2=QString::number(number16,2);ui->lineEdit2_2->setText(strnumber2);}

?問題1:如何進行光標設定

可以使用setCursorPosition方法將光標位置設置在開頭或結尾,或者使用setFocus方法將焦點設置在QLineEdit上。以下是一個示例代碼:

// 創建一個QLineEdit對象
QLineEdit *lineEdit = new QLineEdit(this);// 如果lineEdit為空,將光標位置設置在開頭
if(lineEdit->text().isEmpty()) {lineEdit->setCursorPosition(0); // 將光標位置設置在開頭
}// 或者將焦點設置在lineEdit上
lineEdit->setFocus();

4.案例4

項目需求:使用spinbox微調框來設計如圖所示的計算器?

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButtonCount_clicked()
{int number=ui->spinBoxnumber->value();double signal=ui->doubleSpinBoxsignal->value();double total=number*signal;ui->doubleSpinBoxtotal->setValue(total);
}void Dialog::on_pushButton10_clicked()
{int number10=ui->spinBox10->value();ui->spinBox2->setValue(number10);ui->spinBox16->setValue(number10);}void Dialog::on_pushButton2_clicked()
{int number2=ui->spinBox2->value();ui->spinBox10->setValue(number2);ui->spinBox16->setValue(number2);
}void Dialog::on_pushButton16_clicked()
{int number16=ui->spinBox16->value();ui->spinBox2->setValue(number16);ui->spinBox10->setValue(number16);
}void Dialog::InitUI()
{ui->spinBoxnumber->setMaximum(10000);ui->spinBoxnumber->setMinimum(0);ui->doubleSpinBoxsignal->setMaximum(10000);ui->doubleSpinBoxsignal->setMinimum(0);ui->doubleSpinBoxtotal->setMaximum(10000);ui->doubleSpinBoxtotal->setMinimum(0);ui->spinBox10->setMaximum(10000);ui->spinBox10->setMinimum(0);ui->spinBox2->setMaximum(10000000);ui->spinBox2->setMinimum(0);ui->spinBox16->setMaximum(10000);ui->spinBox16->setMinimum(0);}

問題1:spinBox如何轉換進制

spinbox自帶了進制轉換的功能,使用displayIntergerBase(int)就可進行設定

5.案例5?

項目需求:可以拖動滑動條對編輯區進行顏色的改變?

代碼如下:

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();}Dialog::~Dialog()
{delete ui;
}void Dialog::InitUI()
{//設置滑動條的數值大小ui->horizontalSliderRed->setMinimum(0);ui->horizontalSliderRed->setMaximum(255);ui->horizontalSliderGreen->setMinimum(0);ui->horizontalSliderGreen->setMaximum(255);ui->horizontalSliderBlue->setMinimum(0);ui->horizontalSliderBlue->setMaximum(255);ui->horizontalSlidertransparency->setMinimum(0);ui->horizontalSlidertransparency->setMaximum(255);}void Dialog::on_horizontalSliderRed_valueChanged(int value)
{Q_UNUSED(value);//告訴編譯器不適用這個參數int red=ui->horizontalSliderRed->value();int green=ui->horizontalSliderGreen->value();int blue=ui->horizontalSliderBlue->value();int alpha=ui->horizontalSlidertransparency->value();//透明度QColor color=QColor::fromRgb(red,green,blue,alpha);//將調色板拿出//const QPalette &palette() const;QPalette pal=ui->textEdit->palette();pal.setColor(QPalette::Base,color);ui->textEdit->setPalette(pal);}void Dialog::on_horizontalSliderGreen_valueChanged(int value)
{Q_UNUSED(value);//告訴編譯器不適用這個參數int red=ui->horizontalSliderRed->value();int green=ui->horizontalSliderGreen->value();int blue=ui->horizontalSliderBlue->value();int alpha=ui->horizontalSlidertransparency->value();//透明度QColor color=QColor::fromRgb(red,green,blue,alpha);//將調色板拿出//const QPalette &palette() const;QPalette pal=ui->textEdit->palette();pal.setColor(QPalette::Base,color);ui->textEdit->setPalette(pal);}void Dialog::on_horizontalSliderBlue_valueChanged(int value)
{Q_UNUSED(value);//告訴編譯器不適用這個參數int red=ui->horizontalSliderRed->value();int green=ui->horizontalSliderGreen->value();int blue=ui->horizontalSliderBlue->value();int alpha=ui->horizontalSlidertransparency->value();//透明度QColor color=QColor::fromRgb(red,green,blue,alpha);//將調色板拿出//const QPalette &palette() const;QPalette pal=ui->textEdit->palette();pal.setColor(QPalette::Base,color);ui->textEdit->setPalette(pal);}void Dialog::on_horizontalSlidertransparency_valueChanged(int value)
{Q_UNUSED(value);//告訴編譯器不適用這個參數int red=ui->horizontalSliderRed->value();int green=ui->horizontalSliderGreen->value();int blue=ui->horizontalSliderBlue->value();int alpha=ui->horizontalSlidertransparency->value();//透明度QColor color=QColor::fromRgb(red,green,blue,alpha);//將調色板拿出//const QPalette &palette() const;QPalette pal=ui->textEdit->palette();pal.setColor(QPalette::Base,color);ui->textEdit->setPalette(pal);}

?問題1.palette.setColor(role,color)使用說明

palette.setColor(role, color)?是QPalette類中的一個方法,用于設置調色板中特定角色(role)的顏色為指定的顏色(color)。這個方法可以用來自定義控件的顏色和背景色。

下面是關于palette.setColor(role, color)方法的詳細說明:

  • role:表示調色板中的角色,可以是預定義的一些角色,如windowText(窗口文本顏色)、window(窗口背景色)等。您可以使用QPalette.ColorRole枚舉類型來指定角色,也可以直接使用整數值。例如,QPalette.WindowText表示窗口文本顏色的角色。
  • color:表示要設置的顏色,可以是QColor對象或者顏色的RGB值。您可以使用QColor類來創建顏色對象,也可以直接使用Qt中的預定義顏色,如Qt.blue

示例代碼中的palette.setColor(window.backgroundRole(), QColor(Qt.blue))就是使用palette.setColor(role, color)方法來設置窗口的背景色為藍色。這樣,窗口的背景色就會變成藍色。

6.案例6?

項目需求:拖動滾動條可以改變自己大小?

代碼如下:

void Dialog::on_horizontalScrollBar_valueChanged(int value)
{//獲取文本字體QFont font=ui->plainTextEdit->font();font.setPointSize(value);ui->plainTextEdit->setFont(font);}

7.案例7

項目需求:拖動表盤,下面的值會發生改變?

代碼如下:

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();}Dialog::~Dialog()
{delete ui;
}void Dialog::dial_valueChanged(int value)
{//表盤數值發生變化后label值改變ui->label->setText(QString::number(value)+"KM/H");ui->progressBar->setValue(value);
}void Dialog::InitUI()
{//設置表盤的屬性ui->dial->setMaximum(200);ui->dial->setMinimum(0);//關聯槽信號connect(ui->dial,SIGNAL(valueChanged(int )),this,SLOT(dial_valueChanged(int)));//初始化進度條ui->progressBar->setMaximum(200);ui->progressBar->setMinimum(0);ui->progressBar->setFormat("%p%");//默認值
}

8.案例8

項目需求:移動表盤時,lcd顯示數字會發生改變,同樣要有進制變換功能。

代碼如下:

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_radioButton10_clicked()
{ui->lcdNumber->setDecMode();ui->lcdNumber->setDigitCount(3);
}void Dialog::on_dial_valueChanged(int value)
{//ui->lcdNumber->setDigitCount(value);數字位數ui->lcdNumber->display(value);
}void Dialog::on_radioButton2_clicked()
{ui->lcdNumber->setBinMode();ui->lcdNumber->setDigitCount(8);
}void Dialog::on_radioButton8_clicked()
{ui->lcdNumber->setOctMode();ui->lcdNumber->setDigitCount(3);
}void Dialog::on_radioButton16_clicked()
{ui->lcdNumber->setHexMode();ui->lcdNumber->setDigitCount(3);
}void Dialog::InitUI()
{ui->dial->setMaximum(200);ui->dial->setMinimum(0);}

9.案例9

項目需求:點擊獲取當前時間按鈕會跟新所有的開始時間,當持續時間發生改變時,結束時間也會變化。

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_spinBoxDateLast_valueChanged(int arg1)
{QDate newdate=ui->dateEditStart->date();newdate=newdate.addDays(arg1);ui->dateEditEnd->setDate(newdate);}void Dialog::on_pushButtonGettime_clicked()
{//獲取當前時間QTime time=QTime::currentTime();ui->timeEditStart->setTime(time);QDate date=QDate::currentDate();ui->dateEditStart->setDate(date);QDateTime datetime=QDateTime::currentDateTime();ui->dateTimeEditStart->setDateTime(datetime);
}void Dialog::on_spinBoxTimeLast_valueChanged(int arg1)
{//Qtime 的持續時間改變QTime newtime=ui->timeEditStart->time();int add=60*60*arg1;newtime=newtime.addSecs(add);ui->timeEditEnd->setTime(newtime);}void Dialog::on_spinBoxDatetimeLast_valueChanged(int arg1)
{//Q_REQUIRED_RESULT QDateTime addDays(qint64 days) const;QDateTime newdatetime=ui->dateTimeEditStart->dateTime().addDays(arg1);ui->dateTimeEditEnd->setDateTime(newdatetime);}

10.案例10

項目需求:當選擇日期時,可以同步的顯示

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_dateEditInput_userDateChanged(const QDate &date)
{//將改變的日期顯示在label上QString str=date.toString("yyyy年MM月dd日");ui->lineEditbirth->setText(str);//顯示在calendar上ui->calendarWidget->setSelectedDate(date);
}void Dialog::on_calendarWidget_selectionChanged()
{//日歷的顯示在label上QDate date=ui->calendarWidget->selectedDate();QString str=date.toString("yyyy年MM月dd日");ui->lineEditbirth->setText(str);//日歷顯示在dateEdit上ui->dateEditInput->setDate(date);}

問題1:date如何轉成QString?

#include <QCoreApplication>
#include <QDate>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個QDate對象QDate date = QDate::currentDate();// 將QDate轉換為QStringQString dateString = date.toString("yyyy-MM-dd");// 輸出轉換后的日期字符串qDebug() << "Date as QString: " << dateString;return a.exec();
}

在日期格式字符串中,每個字母和連字符都有特定的含義,用來指定日期和時間的格式。以下是"yyyy-MM-dd"日期格式的詳細解釋:

  • "yyyy":代表四位數的年份,例如2024。
  • "-":連字符用于分隔不同的日期部分。
  • "MM":代表兩位數的月份,從01到12。
  • "-":再次使用連字符分隔不同的日期部分。
  • "dd":代表兩位數的日期,從01到31,根據具體月份而定。

因此,當使用"yyyy-MM-dd"格式時,日期會以"年-月-日"的形式顯示,

11.案例11?

項目需求:設置一個定時器的功能?

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButtonStart_clicked()
{timer->start();
}void Dialog::on_pushButtonStop_clicked()
{timer->stop();
}void Dialog::time_out()
{//時間一到執行的動作static int count=0;ui->progressBar->setValue(count);if(count>ui->progressBar->maximum()){count=0;}count++;}void Dialog::InitUI()
{ui->progressBar->setMaximum(50);ui->progressBar->setValue(0);timer=new QTimer(this);timer->setInterval(50);//定時間隔,單位ms//Qt::CoarseTimer//Coarse timers try to keep accuracy within 5% of the desired intervaltimer->setTimerType(Qt::CoarseTimer);//精度較低connect(timer,SIGNAL(timeout()),this,SLOT(time_out()));}

?問題1:定時器使用方法

Qt提供了兩種定時器類:QTimer和QElapsedTimer。

1.使用Qtimer

QTimer* timer = new QTimer(this); // 創建一個定時器對象
connect(timer, &QTimer::timeout, this, &MyClass::onTimer); // 連接定時器的timeout信號到槽函數
timer->start(1000); // 啟動定時器,參數為定時間隔(毫秒)// 槽函數
void MyClass::onTimer() {// 定時器觸發時執行的操作
}

2.使用QElapsedTimer:

QElapsedTimer timer; // 創建一個計時器對象
timer.start(); // 開始計時// 在需要計時的地方調用elapsed()函數獲取已經過去的時間(毫秒)
qint64 elapsedTime = timer.elapsed();

在使用定時器時,需要注意以下幾點:

  • QTimer的timeout信號在指定的時間間隔內觸發,可以循環執行。
  • 定時器的槽函數中應盡量避免耗時操作,避免阻塞事件循環。
  • 在不再需要定時器時,應調用stop()函數停止定時器,并及時釋放定時器對象。

問題2:start(1000)表示的意思是什么?

timer->start(1000)中的參數1000表示定時器的定時間隔為1000毫秒(即1秒),而不是1秒后調用start函數。調用start()函數后,定時器會立即開始計時,并在每隔1000毫秒觸發一次timeout信號。所以定時器不會在1秒后調用start()函數,而是在調用start()函數后的1秒后第一次觸發timeout信號。

12.案例12

項目需求:當選擇相應的選項時,文本內容會跟著改變。?

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_comboBoxEdu_currentIndexChanged(const QString &arg1)
{//將值輸入到textEdit中QString str="學歷:"+arg1+" "+"城市:"+ui->comboBoxCity->currentText()+" "+"愛好:" + ui->comboBoxLike->currentText();ui->textEdit->setText(str);
}void Dialog::on_comboBoxCity_currentIndexChanged(const QString &arg1)
{//將值輸入到textEdit中QString str="學歷:"+ui->comboBoxEdu->currentText()+" "+"城市:"+arg1+" "+"愛好:" + ui->comboBoxLike->currentText();ui->textEdit->setText(str);
}void Dialog::on_comboBoxLike_currentIndexChanged(const QString &arg1)
{//將值輸入到textEdit中QString str="學歷:"+ui->comboBoxEdu->currentText()+" "+"城市:"+ui->comboBoxCity->currentText()+" "+"愛好:" + arg1;ui->textEdit->setText(str);
}void Dialog::InitUI()
{ui->comboBoxEdu->addItem("大專");QFont font=ui->comboBoxEdu->font();font.setPointSize(12);ui->comboBoxEdu->setFont(font);ui->comboBoxEdu->addItem("高中");ui->comboBoxEdu->addItem("本科");ui->comboBoxCity->addItem("北京");ui->comboBoxCity->addItem("上海");ui->comboBoxCity->addItem("廣州");QFont font1=ui->comboBoxCity->font();font1.setPointSize(12);ui->comboBoxCity->setFont(font1);QIcon *icon;icon=new QIcon;icon->addFile(":/new/images/basketball.png");ui->comboBoxLike->addItem("籃球");ui->comboBoxLike->setItemIcon(0,*icon);QFont font2=ui->comboBoxLike->font();font2.setPointSize(12);ui->comboBoxLike->setFont(font2);ui->comboBoxLike->setIconSize(QSize(48,48));QFont font3=ui->textEdit->font();font3.setPointSize(14);ui->textEdit->setFont(font);}

13.案例13

項目需求:設計如圖所示的案例,上面的按鈕可以實現相應的功能。?

代碼如下:?

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::InitUI()
{ui->listWidget->setIconSize(QSize(48,48));QListWidgetItem*item=new QListWidgetItem;item->setText("c語言");QIcon icon;icon.addFile(":/new/images/C.jpg");item->setIcon(icon);ui->listWidget->addItem(item);ui->listWidget->setSpacing(10);//設置空白行item=new QListWidgetItem;item->setText("C++");QIcon icon1;icon1.addFile(":/new/images/C.jpg");item->setIcon(icon1);ui->listWidget->addItem(item);ui->listWidget->setSpacing(10);item=new QListWidgetItem;item->setText("數據結構");QIcon icon2;icon2.addFile(":/new/images/icon.png");item->setIcon(icon2);ui->listWidget->addItem(item);ui->listWidget->setSpacing(10);item=new QListWidgetItem;item->setText("操作系統");QIcon icon3;icon3.addFile(":/new/images/icon.png");item->setIcon(icon3);ui->listWidget->addItem(item);ui->listWidget->setSpacing(10);item=new QListWidgetItem;item->setText("計算機組成原理");QIcon icon4;icon4.addFile(":/new/images/icon.png");item->setIcon(icon4);ui->listWidget->addItem(item);ui->listWidget->setSpacing(10);item=new QListWidgetItem;item->setText("計算機網絡");QIcon icon5;icon5.addFile(":/new/images/icon.png");item->setIcon(icon5);ui->listWidget->addItem(item);//在圖標模式下,拖動窗口大小的同時,能夠自動的調整函數和列數ui->listWidget->setResizeMode(QListView::Adjust);//設置不可拖動ui->listWidget->setDragEnabled(false);//開始復選框全部為沒選for(int i=0;i<ui->listWidget->count();i++){ui->listWidget->item(i)->setCheckState(Qt::Unchecked);}}void MainWindow::on_actionIcon_triggered()
{ui->listWidget->setViewMode(QListView::IconMode);//設置水平布局,否則在圖標模式下,只有一行多列ui->listWidget->setFlow(QListView::LeftToRight);ui->listWidget->setSpacing(50);//設置不可拖動ui->listWidget->setDragEnabled(false);
}void MainWindow::on_actionList_triggered()
{ui->listWidget->setViewMode(QListView::ListMode);ui->listWidget->setFlow(QListView::TopToBottom);ui->listWidget->setSpacing(10);}void MainWindow::on_actionDel_triggered()
{//刪除選中的項目//從后往前刪除int count=ui->listWidget->count();for(int i=count-1;i>=0;i--){if(ui->listWidget->item(i)->isSelected()){//被選中了,刪除QListWidgetItem*item= ui->listWidget->takeItem(i);delete item;}}
}void MainWindow::on_actionAll_triggered()
{//全選for(int i=0;i<ui->listWidget->count();i++){ui->listWidget->item(i)->setCheckState(Qt::Checked);}
}void MainWindow::on_actionInvert_triggered()
{//反選for(int i=0;i<ui->listWidget->count();i++){if(ui->listWidget->item(i)->checkState()){ui->listWidget->item(i)->setCheckState(Qt::Unchecked);}else{ui->listWidget->item(i)->setCheckState(Qt::Checked);}}
}

14.案例14

項目需求:在案例2的基礎上添加插入圖片的功能。??

代碼如下:?

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QMessageBox>
#include<QFileDialog>
#include<stdio.h>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actionNew_triggered()
{QMessageBox::information(this,"提示","創建了新文件!!!");ui->textEdit->clear();
}void MainWindow::on_actionOpen_triggered()
{//調用打開文件對話框,并返回選擇的文件的文件名//static QString getOpenFileName(QWidget *parent = nullptr,//這個功能很強大QString filename=QFileDialog::getOpenFileName(this,"打開一個文件");QFile file(filename);// bool open(FILE *fh, QIODevice::OpenMode mode,//QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)if(file.open(QIODevice::ReadOnly | QIODevice::Text)){//打開文件成功QString readline;//存儲讀取一行的數據//對數據流進行操作要構建流//QTextStream(FILE *fileHandle, QIODevice::OpenModeQTextStream stream(&file);//bool atEnd() const;是否到底了while(!stream.atEnd()){readline=stream.readLine();//讀取一行//將這一行放到編輯器中ui->textEdit->append(readline);}//將文件名放到狀態欄中labelFilename->setText("當前文件:"+filename);QFont font;font.setPointSize(12);labelFilename->setFont(font);ui->statusbar->addWidget(labelFilename);}else{//打開文件失敗QMessageBox::information(this,"提示","文件打開失敗!!!");}}void MainWindow::on_actionClear_triggered()
{ui->textEdit->clear();
}void MainWindow::on_actionCut_triggered()
{ui->textEdit->cut();
}void MainWindow::on_actionCopy_triggered()
{ui->textEdit->copy();
}void MainWindow::on_actionPaste_triggered()
{ui->textEdit->paste();
}void MainWindow::on_actionItalic_triggered(bool checked)
{//這次不能直接對所有文本進行編輯,必須是選中那部分則哪部分發生變化//QTextCursor textCursor() const;//光標選中的文字
//    QTextCursor cursor=ui->textEdit->textCursor();
//    QString str= cursor.selectedText();QTextCharFormat current=ui->textEdit->currentCharFormat();//固定格式
//      QFont font;
//      font.setPointSize(ui->textEdit->font().pointSize());
//      font.setItalic(checked);
//      current.setFont(font);//方式二//inline void setFontWeight(int weight)current.setFontItalic(checked);//合并當前字體ui->textEdit->mergeCurrentCharFormat(current);}void MainWindow::on_actionBold_triggered(bool checked)
{auto current=ui->textEdit->currentCharFormat();QFont font;font.setPointSize(ui->textEdit->font().pointSize());font.setBold(checked);current.setFont(font);//合并字體ui->textEdit->mergeCurrentCharFormat(current);
}void MainWindow::on_actionUnderline_triggered(bool checked)
{auto current=ui->textEdit->currentCharFormat();current.setFontUnderline(checked);//合并當前字體ui->textEdit->mergeCurrentCharFormat(current);
}void MainWindow::on_spinBox_valueChanged(int value)
{//將文本框中的字體進行改變QFont font;font.setPointSize(value);ui->textEdit->setFont(font);//進度條跟著改變progressbar->setValue(value);
}void MainWindow::on_fontComboBox_currentFontChanged(const QFont &font)
{//設置編輯區里面的字體//ui->textEdit->setFont(font);//出過bugauto current=ui->textEdit->currentCharFormat();current.setFontFamily(font.family());ui->textEdit->mergeCurrentCharFormat(current);
}void MainWindow::on_InsertIcon_triggered()
{//插入圖片QString fileName=QFileDialog::getOpenFileName(this,"選擇本地圖片");if(fileName.isEmpty()){return ;}//html格式QString str=QString::asprintf("<img src=%s",fileName.toStdString().c_str());ui->textEdit->insertHtml(str);//在光標位置插入HTML
}void MainWindow::InitUI()
{//設置插入圖片的動作QAction *InsertIcon=new QAction(this);InsertIcon->setText("插入圖片");InsertIcon->setToolTip("插入圖片");//工具提示QIcon Insert_Icon;Insert_Icon.addFile(":/new/images/InsertIcon.jpg");InsertIcon->setIcon(Insert_Icon);ui->toolBar->addAction(InsertIcon);ui->toolBar->addSeparator();labelFilename=new QLabel;labelFilename->setText("當前文件:");QFont font;font.setPointSize(14);labelFilename->setFont(font);ui->statusbar->addWidget(labelFilename);//初始化字體標簽labelWritesize=new QLabel;labelWritesize->setText("字體大小");ui->toolBar->addWidget(labelWritesize);//設置微調框Spinbox=new QSpinBox;Spinbox->setMinimum(8);Spinbox->setMaximum(50);ui->toolBar->addWidget(Spinbox);//關聯微調框槽函數和信號connect(Spinbox,SIGNAL(valueChanged(int)),this,SLOT(on_spinBox_valueChanged(int)));//初始化進度條progressbar=new QProgressBar;//設置進度條的最大值progressbar->setMaximum(50);progressbar->setValue(10);ui->statusbar->addWidget(progressbar);//設置分隔符ui->toolBar->addSeparator();//字體框標簽fontLable=new QLabel;fontLable->setText("字體");ui->toolBar->addWidget(fontLable);//初始化字體框fontComboBox=new QFontComboBox;fontComboBox->setMinimumWidth(160);ui->toolBar->addWidget(fontComboBox);//關聯字體框和槽函數connect(fontComboBox,SIGNAL(currentFontChanged(const QFont )),this,SLOT(on_fontComboBox_currentFontChanged(const QFont)));//關聯插入圖片的槽函數connect(InsertIcon,SIGNAL(triggered()),this,SLOT(on_InsertIcon_triggered()));}

問題1:QFileDialog打開文件用法

要在Qt中打開一個文件對話框,可以使用QFileDialog類。下面是使用QFileDialog打開文件對話框的步驟:

包含QFileDialog頭文件:

#include <QFileDialog>

調用QFileDialog::getOpenFileName函數

QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"), "",tr("All Files (*);;Text Files (*.txt)"));
  • 第一個參數是指定父窗口,一般傳入this表示當前窗口為父窗口。
  • 第二個參數是指定對話框的標題。
  • 第三個參數是指定默認打開的文件路徑。
  • 第四個參數是指定過濾器,篩選文件類型。多個過濾器可以使用兩個分號進行分隔。
  1. 調用上述函數后,用戶將看到一個打開文件對話框,選擇文件后,將會返回選擇的文件名。

  2. 根據返回的文件名進行后續處理,比如讀取文件內容或者進行其他操作。

注意:在使用QFileDialog打開文件對話框前,需要確保在.pro文件中添加QT += widgets,以確保對話框能夠正常彈出。

15.案例15?

項目需求:設計如qq一樣的工具欄?。

?代碼如下:

#include "dialog.h"
#include "ui_dialog.h"
#include<QListView>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::InitUI()
{//清空原有的itemint count=ui->toolBox->count();for(int i=count-1;i>=0;i--){ui->toolBox->removeItem(i);}//初始化連個listWidgetlistWidgetFriend=new QListWidget;listWidgetStudent=new QListWidget;//設置圖片的到大小listWidgetFriend->setIconSize(QSize(48,48));QFont font;font.setPointSize(12);listWidgetFriend->setFont(font);for(int i=0;i<30;i++){QIcon*icon=new QIcon;icon->addFile(":/new/images/girl.png");QListWidgetItem*item=new QListWidgetItem;item->setText("好友"+QString::number(i+1));item->setIcon(*icon);listWidgetFriend->addItem(item);}//添加到toolBox中ui->toolBox->addItem(listWidgetFriend,"我的好友 30");//設置字體listWidgetStudent->setIconSize(QSize(48,48));QFont font1;font1.setPointSize(12);listWidgetStudent->setFont(font);//圖標模式下,可自行改變行和列
//    listWidgetStudent->setResizeMode(QListView::Adjust);//    //設置為圖表模式
//    listWidgetStudent->setViewMode(QListView::IconMode);//設置我的同學列表for(int i=0;i<60;i++){//設置圖片QIcon icon;icon.addFile(":/new/images/boy.png");QListWidgetItem*item=new QListWidgetItem;item->setText("同學"+QString::number(i+1));item->setIcon(icon);listWidgetStudent->addItem(item);}//加入toolBox中ui->toolBox->addItem(listWidgetStudent,"我的同學 60");}

16.案例16

?項目需求:使用界面設計師類對頭像部分進行封裝,達到以上的效果

代碼如下:?

#include "dialog.h"
#include "ui_dialog.h"
#include<QListView>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);InitUI();
}Dialog::~Dialog()
{delete ui;
}void Dialog::InitUI()
{//清空原有的itemint count=ui->toolBox->count();for(int i=count-1;i>=0;i--){ui->toolBox->removeItem(i);}//初始化連個listWidgetlistWidgetFriend=new QListWidget;listWidgetStudent=new QListWidget;for(int i=0;i<30;i++){//自定義部件只能和原來的進行替換QListWidgetItem*item=new QListWidgetItem;item->setSizeHint(QSize(318,161));//相當與固定大小了listWidgetFriend->addItem(item);//初始化自定義部件myqqdefine=new Myqqdefine(this);myqqdefine->SetIcon(":/new/images/girl.png");myqqdefine->SetNname("好友"+QString::number(i+1));myqqdefine->Setinformation("好好學習,天天向上");listWidgetFriend->setItemWidget(item,myqqdefine);}//添加到toolBox中ui->toolBox->addItem(listWidgetFriend,"我的好友 30");//圖標模式下,可自行改變行和列
//    listWidgetStudent->setResizeMode(QListView::Adjust);//    //設置為圖表模式
//    listWidgetStudent->setViewMode(QListView::IconMode);//設置我的同學列表for(int i=0;i<60;i++){//先插入一個項目,后面進行替換QListWidgetItem*item=new QListWidgetItem;item->setSizeHint(QSize(318,161));listWidgetStudent->addItem(item);myqqdefine=new Myqqdefine(this);myqqdefine->SetIcon(":/new/images/boy.png");myqqdefine->SetNname("同學"+QString::number(i+1));myqqdefine->Setinformation("有志者,事竟成");//替換listWidgetStudent->setItemWidget(item,myqqdefine);}//加入toolBox中ui->toolBox->addItem(listWidgetStudent,"我的同學 60");}

問題1:setSizeHint(QSize(318,161))的作用

在Qt中,調用setSizeHint函數并傳遞一個固定的大小參數,比如QSize(318,161),會將控件的大小提示設置為固定的大小。這意味著在布局管理器中使用該控件時,控件的大小會被建議為318x161像素。布局管理器會嘗試根據這個大小提示來布局控件,但最終布局的實際大小可能會受到布局管理器、窗口大小等因素的影響。

因此,調用setSizeHint函數并傳遞固定大小的參數會影響控件在布局中的大小,但并不會完全固定控件的大小。布局管理器仍然可以根據布局策略和其他因素來調整控件的大小。

問題2:setItemWidget(item, myqqdefine)是替換的作用嗎

listWidgetStudent->setItemWidget(item, myqqdefine)這行代碼的作用是將item上的控件替換為myqqdefine控件。在Qt中,QListWidget中的每個QListWidgetItem都可以包含一個控件,這個控件可以用setItemWidget方法來設置或替換。

17.案例17?

項目需求:使用分裂器達到上述要求 (簡單布局,無需代碼)

18.案例18

項目需求:使用QTreeWidget完成如圖所示的需求。?

代碼如下:?

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actionInit_triggered()
{InitUI();
}void MainWindow::InitUI()
{ui->treeWidget->clear();//ui->treeWidget->setColumnCount(2);//設置列數QStringList list={"科目","描述"};ui->treeWidget->setHeaderLabels(list);//插入第一個頂層結點QTreeWidgetItem*root1=new QTreeWidgetItem(ui->treeWidget);//指定父節點root1->setText(0,"數據結構");root1->setText(1,"算法的基礎");QIcon icon1;icon1.addFile(":/new/images/fold.png");root1->setIcon(0,icon1);//設置第一個頂層結點孩子結點數據QStringList firstChile={"順序表","鏈表","棧","隊列","樹","二叉樹"};int count=firstChile.count();for(int i=0;i<count;i++){QTreeWidgetItem*child=new QTreeWidgetItem(root1);//指定父節點child->setText(0,firstChile[i]);//第0列child->setText(1,"要求熟練掌握");//第1列//設置圖片QIcon icon;icon.addFile(":/new/images/child1.png");child->setIcon(0,icon);}//插入第二個頂層結點QTreeWidgetItem *root2=new QTreeWidgetItem(ui->treeWidget);root2->setText(0,"操作系統");root2->setText(1,"計算機基礎");QIcon icon2;icon2.addFile(":/new/images/fold.png");root2->setIcon(0,icon2);//第二個頂層結點的孩子結點QStringList secondchild={"進程管理","虛擬地址","Cache","IO管理"};count=secondchild.count();for(int i=0;i<count;i++){QTreeWidgetItem*child=new QTreeWidgetItem(root2);//指定父節點child->setText(0,secondchild[i]);child->setText(1,"要求掌握");//設置圖片QIcon icon;icon.addFile(":/new/images/child2.png");child->setIcon(0,icon);}}void MainWindow::on_actionDel_triggered()
{//刪除結點//得通過父節點才能對當前結點進行刪除,所以找到父節點很關鍵//找到當前選中的結點QList<QTreeWidgetItem*>selectList = ui->treeWidget->selectedItems();for(auto it=selectList.constBegin();it!=selectList.constEnd();it++){auto item=*it;//判斷是否有父節點if(item->parent()==nullptr){//沒有父節點,是頂層結點//先找到索引,通過父節點,找到孩子結點的索引int index=ui->treeWidget->indexOfTopLevelItem(item);ui->treeWidget->takeTopLevelItem(index);}else{//不是頂層結點int index=item->parent()->indexOfChild(item);item->parent()->takeChild(index);}}}void MainWindow::on_treeWidget_itemSelectionChanged()
{//將選中的顯示在編輯區里QList<QTreeWidgetItem*> selectList=ui->treeWidget->selectedItems();for(int i=0;i<selectList.count();i++){QTreeWidgetItem*item=selectList[i];//輸出到編輯區中QString str=item->text(0)+"---"+item->text(1);ui->plainTextEdit->appendPlainText(str);}
}void MainWindow::on_actionInsert_triggered()
{//在當前位置插入結點//獲取當前的結點QTreeWidgetItem*item=ui->treeWidget->currentItem();if(item&&item->isSelected()){//有父節點QTreeWidgetItem*parent=item->parent();QTreeWidgetItem*itemNew= new QTreeWidgetItem;//可交互,可編輯,可選擇的itemNew->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable);itemNew->setText(0,"未定義");itemNew->setText(1,"未定義");//用父節點選擇插入方式if(parent){//有父節點//設置圖片QIcon icon;//根據父節點,選擇插入的圖片QString str=parent->text(0);if(str=="數據結構"){icon.addFile(":/new/images/child1.png");}else if(str=="操作系統"){icon.addFile(":/new/images/child2.png");}itemNew->setIcon(0,icon);parent->insertChild(ui->treeWidget->currentIndex().row(),itemNew);}else{//設置圖片QIcon icon;icon.addFile(":/new/images/fold.png");itemNew->setIcon(0,icon);//插入根節點int index = ui->treeWidget->indexOfTopLevelItem(item);ui->treeWidget->insertTopLevelItem(index,itemNew);}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14227.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++的數據結構(十):AVL樹

AVL樹是一種自平衡的二叉搜索樹&#xff0c;得名于其發明者G.M. Adelson-Velsky和E.M. Landis。在AVL樹中&#xff0c;任何節點的兩個子樹的高度最多相差1&#xff0c;這種性質確保了AVL樹的查找、插入和刪除操作的時間復雜度接近O(log n)。 AVL樹是一種二叉搜索樹&#xff0c;…

MongoDB基礎入門到深入(七)建模、調優

文章目錄 系列文章索引十一、MongoDB開發規范十二、MongoDB調優1、三大導致MongoDB性能不佳的原因2、影響MongoDB性能的因素3、MongoDB性能監控工具&#xff08;1&#xff09;mongostat&#xff08;2&#xff09;mongotop&#xff08;3&#xff09;Profiler模塊&#xff08;4&a…

K8S認證|CKA題庫+答案| 16. 升級集群

16、升級集群 CKA v1.29.0模擬系統免費下載試用&#xff1a; 百度網盤&#xff1a;https://pan.baidu.com/s/1vVR_AK6MVK2Jrz0n0R2GoQ?pwdwbki 題目&#xff1a; 您必須在以下Cluster/Node上完成此考題&#xff1a; Cluster Ma…

CTF網絡安全大賽簡單web題目:eval

題目來源于&#xff1a;bugku 題目難度&#xff1a;簡單 一道簡單web的題目 題目源代碼&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 這個PHP腳本有幾個關鍵部分&#xff0c;但…

太陽誘電:順應時代需求的新型電容器為何能在全球得到廣泛應用(下)

隨著汽車電動化和電子控制化的進展&#xff0c;車載計算機和電氣部件也在逐漸向大功率化的方向發展。而構成這些車載設備電源電路的電子元器件也必須隨之進行技術革新。太陽誘電集團攜手全資子公司ELNA&#xff0c;開發并供應新型電容器“導電性高分子混合鋁電解電容器”&#…

【熱門話題】一文帶你讀懂公司是如何知道張三在脈脈上發了“一句話”的

按理說呢&#xff0c;A公司和脈脈屬于不同的平臺&#xff0c;而且脈脈上大家可以匿名發言&#xff0c;所以&#xff0c;即便我坐在你邊上&#xff0c;我發了一句話上去&#xff0c;你也不知道是誰發的。但通過一些技術&#xff0c;我們卻可以分析出&#xff0c;公司是如何知道張…

IOC控制反轉

IOC IOC&#xff0c;全稱為Inversion of Control(控制反轉)&#xff0c;是一種設計原則&#xff0c;它反轉了傳統編程中的控制流程。在傳統的編程模式中&#xff0c;組件之間的依賴關系是由組件自身在內部創建和維護的。而在控制反轉模式中&#xff0c;這種依賴關系由外部容器(…

SSH 免密登錄vscode 附debug 免密登錄失敗問題排查

SSH 免密登錄vscode 附debug 關鍵詞 &#xff1a;vscode ssh ssh無法免密登錄 ssh免密登錄失敗 1 sshd 的配置文件/etc/ssh/sshd_config&#xff0c; 確保公鑰登錄開啟 PubkeyAuthentication yes2 生成公鑰并上傳 ssh-keygen找到本地 .ssh/id_rsa.pub 將其中文本內容搞到…

PS —— 制作證件照

PS —— 制作證件照 裁剪工具魔棒工具油漆桶工具擴展畫布 老是看編程&#xff0c;會有些疲勞&#xff0c;這個專欄我會放一些其他的知識&#xff0c;我們今天利用PS制作證件照&#xff08;注意&#xff0c;這里一些ps的基礎操作我不會很展開的去講&#xff09;&#xff1a; 裁…

Redisson分布式Redis鎖,tryLock方法詳解

在 Java 中&#xff0c;RLock 是 Redisson 庫中提供的一個分布式鎖接口&#xff0c;用于實現基于 Redis 的分布式鎖。RLock 的 tryLock 方法用于嘗試獲取鎖&#xff0c;并在特定的時間內等待獲取鎖。 方法簽名如下&#xff1a; boolean tryLock(long waitTime, long leaseTim…

WPF關鍵組件代碼示例

通過一個綜合示例代碼&#xff0c;展示WPF的關鍵組件&#xff0c;包括XAML、控件、數據綁定、樣式和模板以及動畫。這個示例創建一個簡單的WPF應用程序&#xff0c;包含一個文本框、按鈕和列表框&#xff0c;實現數據綁定、自定義樣式和模板&#xff0c;以及按鈕點擊后的動畫效…

深入解析R語言的貝葉斯網絡模型:構建、優化與預測;INLA下的貝葉斯回歸;現代貝葉斯統計學方法;R語言混合效應(多水平/層次/嵌套)

目錄 ①基于R語言的貝葉斯網絡模型的實踐應用 ②R語言貝葉斯方法在生態環境領域中的應用 ③基于R語言貝葉斯進階:INLA下的貝葉斯回歸、生存分析、隨機游走、廣義可加模型、極端數據的貝葉斯分析 ④基于R語言的現代貝葉斯統計學方法&#xff08;貝葉斯參數估計、貝葉斯回歸、…

react使用AntV

AntV使用&#xff08;https://antv.antgroup.com/&#xff09; import React, { useEffect } from "react"; // npm install antv/g2 import { Chart } from "antv/g2"; const Charts () > { function Ccc() { // 準備數據 const data [ { genre: …

【Linux】腳本shell script

shell是與Linux交互的基本工具 shell script是針對shell所寫的腳本&#xff0c;解釋執行&#xff0c;無需編譯 注意事項 指令的執行是從上而下、從左而右的分析與執行&#xff1b; 指令、選項與參數間的多個空白都會被忽略掉&#xff1b; 空白行也將被忽略掉&#xff0c;并且…

抽象工廠模式(AbstractFactoryPattern)

文章目錄 1.抽象工廠模式定義2.UML類圖3.抽象工廠模式具體實現工廠模式實現單一產品族抽象工廠實現多產品族產品類工廠類使用 4.抽象工廠模式優缺點 1.抽象工廠模式定義 提供一個創建一系列相關或相互依賴對象的接口&#xff0c;而無需指定它們具體的類。 工廠方法模式是單一產…

2024電工杯B題食譜評價與優化模型思路代碼論文分析

2024年電工杯數學建模競賽B題論文和代碼已完成&#xff0c;代碼為B題全部問題的代碼&#xff0c;論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解&#xff08;問題1模型的建立和求解、問題2模型的建立和求解、問題3模型的建立和求解&#xff09;、模型…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-17講 定時器按鍵消抖

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸機篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

計算機網絡安全控制技術

1.防火墻技術 防火墻技術是近年來維護網絡安全最重要的手段&#xff0c;但是防火墻不是萬能的&#xff0c;需要配合其他安全措施來協同 2.加密技術 目前加密技術主要有兩大類&#xff1a;對稱加密和非對稱加密 3.用戶識別技術 核心是識別網絡者是否是屬于系統的合法用戶 …

【設計模式深度剖析】【1】【結構型】【代理模式】| 玩游戲打怪、升級為例加深理解

&#x1f448;?上一篇:創建型設計模式對比 | 下一篇:裝飾器模式&#x1f449;? 目 錄 代理模式定義英文原話直譯如何理解&#xff1f; 3個角色UML類圖1. 抽象主題&#xff08;Subject&#xff09;角色2. 代理類&#xff1a;代理主題&#xff08;Proxy Subject&#xff0…

UE5 OnlineSubsystem Steam創建會話失敗解決方法

連接上Steam但是創建會話失敗 解決方法 在DefaultEngine.ini中加上bInitServerOnClienttrue,這個其實在官方文檔里用注釋給出了&#xff0c;直接取消注釋就行 刪除項目目錄中的Saved、Internmediate、Binaries目錄 右鍵你的項目.uproject選擇Generate Visual Studio project f…