#include "frmCameraSetUp.h" #include #include #include #include #include #include #include #include "datavar.h" frmCameraSetUp::frmCameraSetUp(QWidget* parent) : QDialog(parent) { ui.setupUi(this); //FramelessWindowHint属性设置窗口去除边框 //WindowMinimizeButtonHint 属性设置在窗口最小化时,点击任务栏窗口可以显示出原窗口 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint); //设置窗体在屏幕中间位置 QDesktopWidget* desktop = QApplication::desktop(); move((desktop->width() - this->width()) / 2, (desktop->height() - this->height()) / 2); //设置窗口背景透明 setAttribute(Qt::WA_TranslucentBackground); this->setWindowIcon(QIcon(":/res/ico/cam.png")); //初始化标题栏 initTitleBar(); //设置表格列宽 ui.tableWidget->setColumnWidth(0, 256); //隐藏水平header ui.tableWidget->verticalHeader()->setVisible(false); ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行 ui.tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置只能单选 connect(ui.tableWidget, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(slot_DoubleClicked(int, int))); ReadOnlyDelegate* readOnlyDelegate = new ReadOnlyDelegate(this); ui.tableWidget->setItemDelegateForColumn(0, readOnlyDelegate); //设置第1列只读 //添加右键菜单 AddRightButtonMenu(); mindvision_camera_state = 0; } frmCameraSetUp::~frmCameraSetUp() { this->deleteLater(); } void frmCameraSetUp::initTitleBar() { MyTitleBar* m_titleBar = new MyTitleBar(this); m_titleBar->move(0, 0); connect(m_titleBar, SIGNAL(signalButtonCloseClicked()), this, SLOT(onButtonCloseClicked())); m_titleBar->setBackgroundColor(3, 110, 95); m_titleBar->setStyleSheet("background-color: rgba(0, 0, 0,0);color:white;font-size:16px"); m_titleBar->setTitleIcon(":/res/ico/cam.png"); m_titleBar->setTitleContent("相机设置"); m_titleBar->setButtonType(ONLY_CLOSE_BUTTON); m_titleBar->setTitleWidth(this->width()); } void frmCameraSetUp::paintEvent(QPaintEvent* event) { //设置背景色 QPainter painter(this); QPainterPath pathBack; pathBack.setFillRule(Qt::WindingFill); pathBack.addRoundedRect(QRect(0, 0, this->width(), this->height()), 3, 3); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); painter.fillPath(pathBack, QBrush(QColor("#bcc2bc"))); return QWidget::paintEvent(event); } void frmCameraSetUp::onButtonCloseClicked() { this->close(); } //右键菜单 void frmCameraSetUp::AddRightButtonMenu() { QMenu* m_menu = new QMenu(this); //菜单样式 QString menuStyle( "QMenu::item{" "color: rgb(0, 0, 0);" "}" "QMenu::item:hover{" "background-color: rgb(176, 190, 225);" "}" "QMenu::item:selected{" "background-color: rgb(176, 190, 225);" "}" ); QString buttonStyle( "QPushButton{" "color: rgb(0, 0, 0);" "border: none;" "text-align: left;" "font: 9pt Microsoft YaHei;" "padding-left: 5px;" "padding-right: 5px;" "min-height: 23px;" "}" "QPushButton::hover{" "background-color: rgba(176, 190, 225, 200);" "}" "QPushButton::selected{" "background-color: rgba(176, 190, 255, 255);" "}" ); m_menu->setStyleSheet(menuStyle); QPushButton* moveUpAction_buf = new QPushButton(m_menu); moveUpAction_buf->setStyleSheet(buttonStyle); moveUpAction_buf->setText("上移"); moveUpAction_buf->setIconSize(QSize(20, 20)); moveUpAction_buf->setIcon(QIcon(":/res/ico/previous.png")); QWidgetAction* moveUpAction = new QWidgetAction(this); moveUpAction->setDefaultWidget(moveUpAction_buf); connect(moveUpAction_buf, &QPushButton::clicked, this, &frmCameraSetUp::slot_MoveUp); connect(moveUpAction_buf, &QPushButton::clicked, m_menu, &QMenu::close); m_menu->addAction(moveUpAction); QPushButton* moveDownAction_buf = new QPushButton(m_menu); moveDownAction_buf->setStyleSheet(buttonStyle); moveDownAction_buf->setText("下移"); moveDownAction_buf->setIconSize(QSize(20, 20)); moveDownAction_buf->setIcon(QIcon(":/res/ico/next.png")); QWidgetAction* moveDownAction = new QWidgetAction(this); moveDownAction->setDefaultWidget(moveDownAction_buf); connect(moveDownAction_buf, &QPushButton::clicked, this, &frmCameraSetUp::slot_MoveDown); connect(moveDownAction_buf, &QPushButton::clicked, m_menu, &QMenu::close); m_menu->addAction(moveDownAction); QPushButton* deleteNameAction_buf = new QPushButton(m_menu); deleteNameAction_buf->setStyleSheet(buttonStyle); deleteNameAction_buf->setText("删除"); deleteNameAction_buf->setIconSize(QSize(21, 21)); deleteNameAction_buf->setIcon(QIcon(":/res/ico/del.png")); QWidgetAction* deleteNameAction = new QWidgetAction(this); deleteNameAction->setDefaultWidget(deleteNameAction_buf); connect(deleteNameAction_buf, &QPushButton::clicked, this, &frmCameraSetUp::slot_DeleteName); connect(deleteNameAction_buf, &QPushButton::clicked, m_menu, &QMenu::close); m_menu->addAction(deleteNameAction); //给控件设置上下文菜单策略 ui.tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); //给信号设置相应的槽函数 connect(ui.tableWidget, &QTableWidget::customContextMenuRequested, [=](const QPoint& pos) { //参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角 m_menu->exec(QCursor::pos()); }); } void frmCameraSetUp::on_btnAddCamera_clicked() { if (ui.comboCameraName->currentText() == QString()) { emit dataVar::fProItemTab->sig_WarnClick(); emit dataVar::fProItemTab->sig_Log("未找到或选择相机!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "警告", "未找到或选择相机!"); msgBox.setWindowIcon(QIcon(":/res/ico/warn.png")); msgBox.exec(); return; } else { int count = ui.tableWidget->rowCount(); QString cam_name = ui.comboCamera->currentText() + "_" + ui.comboCameraName->currentText(); for (int m = 0; m < count; m++) { if (cam_name == ui.tableWidget->item(m, 0)->text()) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("已存在该相机名称!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "已存在该相机名称!"); msgBox.setWindowIcon(QIcon(":/resource/error.png")); msgBox.exec(); return; } } ui.tableWidget->setRowCount(count + 1); //设置行数 QTableWidgetItem* item_type = new QTableWidgetItem(cam_name); item_type->setFlags(item_type->flags() & (~Qt::ItemIsEditable)); //设置列不可编辑 ui.tableWidget->setItem(count, 0, item_type); } } void frmCameraSetUp::on_btnSearchCamera_clicked() { //搜索相机 ui.comboCameraName->clear(); switch (ui.comboCamera->currentIndex()) { case 0: tSdkCameraDevInfo sCameraList_buf[9]; iCameraNums = 9; //返回的相机信息列表,会根据acFriendlyName排序 if (CameraEnumerateDevice(sCameraList_buf, &iCameraNums) != CAMERA_STATUS_SUCCESS || iCameraNums == 0) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("未搜索到迈德威视相机!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "未搜索到迈德威视相机!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } sCameraList.clear(); for (int i = 0; i < iCameraNums; i++) { sCameraList.append(sCameraList_buf[i]); ui.comboCameraName->addItem(sCameraList_buf[i].acFriendlyName); } break; case 1: //海康威视 break; } } void frmCameraSetUp::on_btnConnect_clicked() { //连接相机 if (ui.lblType->text() == QString()) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("选择相机名称为空!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "选择相机名称为空!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } QStringList strs = ui.lblType->text().split("_"); if (strs[0] == "MindVision") { //迈德威视 camera_keys.clear(); camera_keys = global_camera_content.uniqueKeys(); int count = 0; int ccd_Index = 0; for (int k = 0; k < camera_keys.length(); k++) { QString key = camera_keys[k]; if (key == ui.lblType->text()) { ccd_Index = k; count = 1; ui.spinExposure->setValue(global_camera_content.value(key).global_exposure); ui.spinGain->setValue(global_camera_content.value(key).global_gain); ui.spinGamma->setValue(global_camera_content.value(key).global_gamma); ui.spinContrast->setValue(global_camera_content.value(key).global_contrast); ui.comboTriggerMode->setCurrentText(global_camera_content.value(key).global_trigger_mode); ui.spinTimeOut->setValue(global_camera_content.value(key).global_timeout); CameraContent.ccd_index = ccd_Index; global_camera_content.insert(key, CameraContent); break; } } if (count == 0) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("该相机参数未保存!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "该相机参数未保存!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } for (int n = 0; n < dataVar::camera_state.count(); n++) { if (dataVar::camera_state[n] == ui.lblType->text()) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log(ui.lblType->text() + "相机已连接!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", ui.lblType->text() + "相机已连接!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } } //初始化相机,(-1,-1)表示加载上次退出前保存的参数,如果是第一次使用该相机,则加载默认参数 if ((status = CameraInit(&sCameraList[ccd_Index], -1, -1, &mindvision_haldle)) != CAMERA_STATUS_SUCCESS) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("初始化相机失败!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "初始化相机失败!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } //获得该相机的特性描述 CameraGetCapability(mindvision_haldle, &sCameraInfo); mindvision_framebuffer = (BYTE*)CameraAlignMalloc(sCameraInfo.sResolutionRange.iWidthMax * sCameraInfo.sResolutionRange.iWidthMax * 3, 16); //设置曝光 CameraSetAeState(mindvision_haldle, false); CameraSetExposureTime(mindvision_haldle, ui.spinExposure->value()); //设置增益 CameraSetAnalogGain(mindvision_haldle, ui.spinGain->value()); //设置伽马 CameraSetGamma(mindvision_haldle, ui.spinGamma->value() * 100); //设置对比度 CameraSetContrast(mindvision_haldle, ui.spinContrast->value()); //设置触发模式 int iModeSel = 0; if (ui.comboTriggerMode->currentIndex() == 0) { iModeSel = 0; } else if (ui.comboTriggerMode->currentIndex() == 1) { iModeSel = 1; } else if (ui.comboTriggerMode->currentIndex() == 2) { iModeSel = 2; } CameraSetTriggerMode(mindvision_haldle, iModeSel); //保存当前相机参数到指定的参数组中 CameraSaveParameter(mindvision_haldle, 0); if (sCameraInfo.sIspCapacity.bMonoSensor) { CameraSetIspOutFormat(mindvision_haldle, CAMERA_MEDIA_TYPE_MONO8); } CameraPlay(mindvision_haldle); gVariable::CameraVar.camera_type = "MindVision"; gVariable::CameraVar.mindvision_haldle_value = mindvision_haldle; gVariable::CameraVar.mindvision_framebuffer_value = mindvision_framebuffer; gVariable::CameraVar.time_out = ui.spinTimeOut->value(); gVariable::camera_variable_link.insert(ui.lblType->text(), gVariable::CameraVar); dataVar::camera_state.append(ui.lblType->text()); emit dataVar::fProItemTab->sig_InfoClick(); emit dataVar::fProItemTab->sig_Log(ui.lblType->text() + "相机连接成功!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "提示", ui.lblType->text() + "相机连接成功!"); msgBox.setWindowIcon(QIcon(":/res/ico/info.png")); msgBox.exec(); } else if (strs[0] == "HIKVision") { //海康威视 } //更新获取图像工具 QList link_keys = dataVar::all_link_process.uniqueKeys(); for (int i = 0; i < link_keys.length(); i++) { int key = link_keys[i]; for (int j = 0; j < 20; j++) { if (j == key) { QConfig::ToolBase[key]->RunCommunicationLink("获取图像"); } } } } //初始化相机连接 void frmCameraSetUp::InitCameraConnect(QString camera_key_value) { QStringList strs = camera_key_value.split("_"); if (strs[0] == "MindVision") { tSdkCameraDevInfo sCameraList_buf[9]; iCameraNums = 9; //返回的相机信息列表,会根据acFriendlyName排序 if (CameraEnumerateDevice(sCameraList_buf, &iCameraNums) != CAMERA_STATUS_SUCCESS || iCameraNums == 0) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("未搜索到迈德威视相机!"); dataVar::camera_state.clear(); return; } int ccd_Index = global_camera_content.value(camera_key_value).ccd_index; bool cam_state = false; sCameraList.clear(); for (int i = 0; i < iCameraNums; i++) { sCameraList.append(sCameraList_buf[i]); ui.comboCameraName->addItem(sCameraList_buf[i].acFriendlyName); if (camera_key_value.mid(11, camera_key_value.length() - 1) == sCameraList_buf[i].acFriendlyName) { if (i == ccd_Index) { cam_state = true; } } } if (cam_state == false) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log(camera_key_value + "相机索引错误!"); dataVar::camera_state.removeOne(camera_key_value); return; } //初始化相机,(-1,-1)表示加载上次退出前保存的参数,如果是第一次使用该相机,则加载默认参数 if ((status = CameraInit(&sCameraList[ccd_Index], -1, -1, &mindvision_haldle)) != CAMERA_STATUS_SUCCESS) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("初始化" + camera_key_value + "相机失败!"); dataVar::camera_state.removeOne(camera_key_value); return; } //获得该相机的特性描述 CameraGetCapability(mindvision_haldle, &sCameraInfo); mindvision_framebuffer = (BYTE*)CameraAlignMalloc(sCameraInfo.sResolutionRange.iWidthMax * sCameraInfo.sResolutionRange.iWidthMax * 3, 16); //设置曝光 CameraSetAeState(mindvision_haldle, false); CameraSetExposureTime(mindvision_haldle, global_camera_content.value(camera_key_value).global_exposure); //设置增益 CameraSetAnalogGain(mindvision_haldle, global_camera_content.value(camera_key_value).global_gain); //设置伽马 CameraSetGamma(mindvision_haldle, global_camera_content.value(camera_key_value).global_gamma * 100); //设置对比度 CameraSetContrast(mindvision_haldle, global_camera_content.value(camera_key_value).global_contrast); //设置触发模式 int iModeSel = 0; if (global_camera_content.value(camera_key_value).global_trigger_mode == "连续采集") { iModeSel = 0; } else if (global_camera_content.value(camera_key_value).global_trigger_mode == "软件触发") { iModeSel = 1; } else if (global_camera_content.value(camera_key_value).global_trigger_mode == "硬件触发") { iModeSel = 2; } CameraSetTriggerMode(mindvision_haldle, iModeSel); //保存当前相机参数到指定的参数组中 CameraSaveParameter(mindvision_haldle, 0); if (sCameraInfo.sIspCapacity.bMonoSensor) { CameraSetIspOutFormat(mindvision_haldle, CAMERA_MEDIA_TYPE_MONO8); } CameraPlay(mindvision_haldle); gVariable::CameraVar.camera_type = "MindVision"; gVariable::CameraVar.mindvision_haldle_value = mindvision_haldle; gVariable::CameraVar.mindvision_framebuffer_value = mindvision_framebuffer; gVariable::camera_variable_link.insert(camera_key_value, gVariable::CameraVar); dataVar::camera_state.append(camera_key_value); emit dataVar::fProItemTab->sig_InfoClick(); emit dataVar::fProItemTab->sig_Log(camera_key_value + "相机连接成功!"); } //更新获取图像工具 QList link_keys = dataVar::all_link_process.uniqueKeys(); for (int i = 0; i < link_keys.length(); i++) { int key = link_keys[i]; for (int j = 0; j < 20; j++) { if (j == key) { QConfig::ToolBase[key]->RunCommunicationLink("获取图像"); } } } } void frmCameraSetUp::on_btnDisconnect_clicked() { //断开相机 if (ui.lblType->text() == QString()) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("选择相机名称为空!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "选择相机名称为空!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } QStringList strs = ui.lblType->text().split("_"); if (strs[0] == "MindVision") { //迈德威视 camera_keys.clear(); camera_keys = gVariable::camera_variable_link.uniqueKeys(); int count = 0; for (int k = 0; k < camera_keys.length(); k++) { QString key = camera_keys[k]; if (key == ui.lblType->text()) { if (gVariable::camera_variable_link.value(key).mindvision_haldle_value > 0) { CameraStop(gVariable::camera_variable_link.value(key).mindvision_haldle_value); //相机反初始化,释放资源 CameraUnInit(gVariable::camera_variable_link.value(key).mindvision_haldle_value); CameraAlignFree(gVariable::camera_variable_link.value(key).mindvision_framebuffer_value); dataVar::camera_state.removeOne(ui.lblType->text()); gVariable::camera_variable_link.remove(key); count = 1; emit dataVar::fProItemTab->sig_InfoClick(); emit dataVar::fProItemTab->sig_Log(ui.lblType->text() + "已断开连接!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "提示", "该相机已断开连接!"); msgBox.setWindowIcon(QIcon(":/res/ico/info.png")); msgBox.exec(); } } } if (count == 0) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("该相机未连接!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "该相机未连接!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } } else if (strs[0] == "HIKVision") { //海康威视 } //更新获取图像工具 QList link_keys = dataVar::all_link_process.uniqueKeys(); for (int i = 0; i < link_keys.length(); i++) { int key = link_keys[i]; for (int j = 0; j < 20; j++) { if (j == key) { QConfig::ToolBase[key]->RunCommunicationLink("获取图像"); } } } } void frmCameraSetUp::on_btnSave_clicked() { //保存参数 if (ui.lblType->text() == QString()) { emit dataVar::fProItemTab->sig_ErrorClick(); emit dataVar::fProItemTab->sig_Log("选择相机名称为空!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "错误", "选择相机名称为空!"); msgBox.setWindowIcon(QIcon(":/res/ico/error.png")); msgBox.exec(); return; } CameraContent.global_exposure = ui.spinExposure->value(); CameraContent.global_gain = ui.spinGain->value(); CameraContent.global_gamma = ui.spinGamma->value(); CameraContent.global_contrast = ui.spinContrast->value(); CameraContent.global_trigger_mode = ui.comboTriggerMode->currentText(); CameraContent.global_timeout = ui.spinTimeOut->value(); CameraContent.global_remark = ui.txtRemark->text(); global_camera_content.insert(ui.lblType->text(), CameraContent); emit dataVar::fProItemTab->sig_InfoClick(); emit dataVar::fProItemTab->sig_Log(ui.lblType->text() + "保存参数完成!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "提示", "保存参数完成!"); msgBox.setWindowIcon(QIcon(":/res/ico/info.png")); msgBox.exec(); } void frmCameraSetUp::slot_DoubleClicked(int row, int column) { QString selectInstrument = ui.tableWidget->item(row, 0)->text(); ui.lblType->setText(selectInstrument); camera_keys.reserve(100); camera_keys.clear(); camera_keys = global_camera_content.uniqueKeys(); int count = 0; for (int k = 0; k < camera_keys.length(); k++) { QString key = camera_keys[k]; if (key == selectInstrument) { count = 1; ui.spinExposure->setValue(global_camera_content.value(key).global_exposure); ui.spinGain->setValue(global_camera_content.value(key).global_gain); ui.spinGamma->setValue(global_camera_content.value(key).global_gamma); ui.spinContrast->setValue(global_camera_content.value(key).global_contrast); ui.comboTriggerMode->setCurrentText(global_camera_content.value(key).global_trigger_mode); ui.spinTimeOut->setValue(global_camera_content.value(key).global_timeout); ui.txtRemark->setText(global_camera_content.value(key).global_remark); } } if (count == 0) { emit dataVar::fProItemTab->sig_WarnClick(); emit dataVar::fProItemTab->sig_Log("该相机参数未保存!"); QMessageBox msgBox(QMessageBox::Icon::NoIcon, "警告", "该相机参数未保存!"); msgBox.setWindowIcon(QIcon(":/res/ico/warn.png")); msgBox.exec(); } } void frmCameraSetUp::slot_MoveUp() { int nRow = ui.tableWidget->currentRow(); moveRow(ui.tableWidget, nRow, nRow - 1); } void frmCameraSetUp::slot_MoveDown() { int nRow = ui.tableWidget->currentRow(); moveRow(ui.tableWidget, nRow, nRow + 2); } void frmCameraSetUp::slot_DeleteName() { int rowIndex = ui.tableWidget->currentRow(); if (rowIndex != -1) { QString str = ui.tableWidget->item(rowIndex, 0)->text(); global_camera_content.remove(str); gVariable::camera_variable_link.remove(str); ui.tableWidget->removeRow(rowIndex); } int count = ui.tableWidget->rowCount(); if (count == 0) { ui.lblType->clear(); global_camera_content.clear(); gVariable::camera_variable_link.clear(); } //更新获取图像工具 QList link_keys = dataVar::all_link_process.uniqueKeys(); for (int i = 0; i < link_keys.length(); i++) { int key = link_keys[i]; for (int j = 0; j < 20; j++) { if (j == key) { QConfig::ToolBase[key]->RunCommunicationLink("获取图像"); } } } } void frmCameraSetUp::moveRow(QTableWidget* pTable, int nFrom, int nTo) { if (pTable == NULL) return; pTable->setFocus(); if (nFrom == nTo) return; if (nFrom < 0 || nTo < 0) return; int nRowCount = pTable->rowCount(); if (nFrom >= nRowCount || nTo > nRowCount) return; if (nTo < nFrom) nFrom++; pTable->insertRow(nTo); int nCol = pTable->columnCount(); for (int i = 0; i < nCol; i++) { pTable->setItem(nTo, i, pTable->takeItem(nFrom, i)); } if (nFrom < nTo) { nTo--; } pTable->removeRow(nFrom); pTable->selectRow(nTo); }