diff --git a/src/device/scannerdevice.cpp b/src/device/scannerdevice.cpp index 3f01e6e..ab7c274 100644 --- a/src/device/scannerdevice.cpp +++ b/src/device/scannerdevice.cpp @@ -80,7 +80,7 @@ ScannerDevice::ScannerDevice(QObject *parent) // 2 print normal messages // 3 print debugging messages // 4 print everything - QString logLevel = "1"; + QString logLevel = "2"; #ifdef QT_DEBUG logLevel = "2"; #endif @@ -97,10 +97,11 @@ ScannerDevice::ScannerDevice(QObject *parent) ScannerDevice::~ScannerDevice() { #ifndef _WIN32 + qCInfo(app) << "🔥 ScannerDevice destructor called - this should NOT happen during device list refresh!"; closeDevice(); // Ensure device is closed if open if (m_saneInitialized) { sane_exit(); - qCDebug(app) << "SANE backend exited successfully"; + qCInfo(app) << "SANE backend exited from destructor"; } #endif } @@ -140,17 +141,28 @@ QStringList ScannerDevice::getAvailableDevices() return deviceNames; } - - // Try calling sane_get_devices with different parameters - qCDebug(app) << "Attempting to get device list (include network devices)"; const SANE_Device **device_list = nullptr; - SANE_Status status = sane_get_devices(&device_list, SANE_TRUE); + + // First attempt: Get ALL devices including network devices (ESCL/AirScan) + qCDebug(app) << "First attempt: Getting ALL devices (including network devices)"; + SANE_Status status = sane_get_devices(&device_list, SANE_FALSE); qCDebug(app) << "Device list status:" << sane_strstatus(status); - if (status != SANE_STATUS_GOOD || !device_list) { - qCDebug(app) << "Retrying device list (local devices only)"; + // If first attempt fails or returns no devices, wait and retry + // This is especially important for network devices (ESCL/AirScan) which need discovery time + if (status != SANE_STATUS_GOOD || !device_list || (device_list && !device_list[0])) { + qCInfo(app) << "First attempt returned no devices, waiting for network discovery..."; + QThread::msleep(2000); // Wait 2 seconds for network device discovery + + qCDebug(app) << "Retrying: Getting ALL devices (including network devices)"; status = sane_get_devices(&device_list, SANE_FALSE); qCDebug(app) << "Device list retry status:" << sane_strstatus(status); + + if (status != SANE_STATUS_GOOD || !device_list || (device_list && !device_list[0])) { + qCDebug(app) << "Still no devices, trying local devices only"; + status = sane_get_devices(&device_list, SANE_TRUE); + qCDebug(app) << "Local devices only status:" << sane_strstatus(status); + } } if (status != SANE_STATUS_GOOD) { @@ -193,14 +205,22 @@ QStringList ScannerDevice::getAvailableDevices() } qCDebug(app) << "Enumerating available scanner devices"; + int deviceCount = 0; + + // First count devices + for (int i = 0; device_list[i] != nullptr; ++i) { + deviceCount++; + } + qCInfo(app) << "Found" << deviceCount << "SANE devices total"; + for (int i = 0; device_list[i] != nullptr; ++i) { const SANE_Device *dev = device_list[i]; if (dev) { - qCDebug(app) << "Device found:"; - qCDebug(app) << " Name:" << (dev->name ? dev->name : "null"); - qCDebug(app) << " Vendor:" << (dev->vendor ? dev->vendor : "null"); - qCDebug(app) << " Model:" << (dev->model ? dev->model : "null"); - qCDebug(app) << " Type:" << (dev->type ? dev->type : "null"); + qCInfo(app) << "Device" << (i+1) << "/" << deviceCount << ":"; + qCInfo(app) << " Name:" << (dev->name ? dev->name : "null"); + qCInfo(app) << " Vendor:" << (dev->vendor ? dev->vendor : "null"); + qCInfo(app) << " Model:" << (dev->model ? dev->model : "null"); + qCInfo(app) << " Type:" << (dev->type ? dev->type : "null"); if (dev->name) { deviceNames.append(QString::fromUtf8(dev->name)); @@ -211,10 +231,16 @@ QStringList ScannerDevice::getAvailableDevices() .arg(dev->model ? QString::fromUtf8(dev->model) : "Unknown") .arg(dev->type ? QString::fromUtf8(dev->type) : "Unknown"); - qCDebug(app) << "Added device:" << dev->name << "-" << deviceInfo; + qCInfo(app) << "✅ Successfully added device:" << dev->name << "-" << deviceInfo; + } else { + qCWarning(app) << "❌ Device has null name, skipping"; } + } else { + qCWarning(app) << "❌ Device at index" << i << "is null"; } } + + qCInfo(app) << "Final device list contains" << deviceNames.size() << "devices:" << deviceNames; #if ADD_TEST_DEVICE // If no devices found, add a virtual test device diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5bb748a..dc8bafe 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -27,9 +27,10 @@ MainWindow::MainWindow(QWidget *parent) : DMainWindow(parent) { // --- Initialize Devices --- - QSharedPointer scannerDevice(new ScannerDevice(this)); + // Note: Don't pass 'this' as parent when using QSharedPointer to avoid double-deletion + QSharedPointer scannerDevice(new ScannerDevice(nullptr)); scannerDevice->initialize(); - QSharedPointer webcamDevice(new WebcamDevice(this)); + QSharedPointer webcamDevice(new WebcamDevice(nullptr)); webcamDevice->initialize(); // Store devices in map @@ -106,14 +107,30 @@ void MainWindow::updateDeviceList() auto webcam = qSharedPointerCast(m_devices["webcam"]); if (scanner && webcam) { - // 更新ScannersWidget中的设备列表 - m_scannersWidget->updateDeviceList(scanner, webcam); + // 给网络设备发现预留更多时间(特别是首次启动) + static bool firstRun = true; + int delay = firstRun ? 3000 : 500; // 首次启动等待3秒,后续等待0.5秒 + + if (firstRun) { + qCInfo(app) << "First device list update, allowing extra time for network device discovery..."; + firstRun = false; + } + + // 使用定时器延迟更新设备列表 + QTimer::singleShot(delay, this, [this]() { + // 重新获取设备指针,避免捕获过期指针 + auto scanner = qSharedPointerCast(m_devices["scanner"]); + auto webcam = qSharedPointerCast(m_devices["webcam"]); + + if (scanner && webcam) { + m_scannersWidget->updateDeviceList(scanner, webcam); + } + QTimer::singleShot(500, this, &MainWindow::hideLoading); + }); } else { qDebug(app) << "Error: Failed to cast device pointers"; + QTimer::singleShot(500, this, &MainWindow::hideLoading); } - - - QTimer::singleShot(500, this, &MainWindow::hideLoading); } void MainWindow::showScanView(const QString &device, bool isScanner)