增加软件的降级模式,在慢速模式的用量用光后可以回退到极速模式
Showing
2 changed files
with
145 additions
and
7 deletions
| ... | @@ -1470,6 +1470,17 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -1470,6 +1470,17 @@ class ImageGeneratorWindow(QMainWindow): |
| 1470 | settings_group = QGroupBox("生成设置") | 1470 | settings_group = QGroupBox("生成设置") |
| 1471 | settings_layout = QVBoxLayout() | 1471 | settings_layout = QVBoxLayout() |
| 1472 | 1472 | ||
| 1473 | # 生成模式(放在最前面) | ||
| 1474 | settings_layout.addWidget(QLabel("生成模式")) | ||
| 1475 | self.generation_mode = QComboBox() | ||
| 1476 | self.generation_mode.addItems(["极速模式", "慢速模式"]) | ||
| 1477 | self.generation_mode.setCurrentIndex(0) # Default to 极速模式 | ||
| 1478 | self.generation_mode.currentIndexChanged.connect(self.on_generation_mode_changed) | ||
| 1479 | settings_layout.addWidget(self.generation_mode) | ||
| 1480 | |||
| 1481 | settings_layout.addSpacing(10) | ||
| 1482 | |||
| 1483 | # 宽高比 | ||
| 1473 | settings_layout.addWidget(QLabel("宽高比")) | 1484 | settings_layout.addWidget(QLabel("宽高比")) |
| 1474 | self.aspect_ratio = QComboBox() | 1485 | self.aspect_ratio = QComboBox() |
| 1475 | self.aspect_ratio.addItems(["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]) | 1486 | self.aspect_ratio.addItems(["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]) |
| ... | @@ -1477,10 +1488,12 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -1477,10 +1488,12 @@ class ImageGeneratorWindow(QMainWindow): |
| 1477 | 1488 | ||
| 1478 | settings_layout.addSpacing(10) | 1489 | settings_layout.addSpacing(10) |
| 1479 | 1490 | ||
| 1491 | # 图片尺寸 | ||
| 1480 | settings_layout.addWidget(QLabel("图片尺寸")) | 1492 | settings_layout.addWidget(QLabel("图片尺寸")) |
| 1481 | self.image_size = QComboBox() | 1493 | self.image_size = QComboBox() |
| 1482 | self.image_size.addItems(["1K", "2K", "4K"]) | 1494 | self.image_size.addItems(["1K", "2K", "4K"]) |
| 1483 | self.image_size.setCurrentIndex(1) # Default to 2K | 1495 | self.image_size.setCurrentIndex(0) # Default to 1K for 极速模式 |
| 1496 | self.image_size.currentIndexChanged.connect(self.on_image_size_changed) | ||
| 1484 | settings_layout.addWidget(self.image_size) | 1497 | settings_layout.addWidget(self.image_size) |
| 1485 | 1498 | ||
| 1486 | settings_layout.addSpacing(10) | 1499 | settings_layout.addSpacing(10) |
| ... | @@ -1764,6 +1777,9 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -1764,6 +1777,9 @@ class ImageGeneratorWindow(QMainWindow): |
| 1764 | self.status_label.setText(f"● 已添加 {valid_count} 张参考图片") | 1777 | self.status_label.setText(f"● 已添加 {valid_count} 张参考图片") |
| 1765 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") | 1778 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") |
| 1766 | self.logger.info(f"图片上传完成,有效图片: {valid_count} 张") | 1779 | self.logger.info(f"图片上传完成,有效图片: {valid_count} 张") |
| 1780 | |||
| 1781 | # 检查极速模式下的多图限制 | ||
| 1782 | self.check_multi_image_mode_conflict() | ||
| 1767 | else: | 1783 | else: |
| 1768 | self.logger.info("用户取消了图片选择") | 1784 | self.logger.info("用户取消了图片选择") |
| 1769 | 1785 | ||
| ... | @@ -1793,6 +1809,9 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -1793,6 +1809,9 @@ class ImageGeneratorWindow(QMainWindow): |
| 1793 | self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张") | 1809 | self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张") |
| 1794 | self.status_label.setText(f"● 已通过拖拽添加 {added_count} 张参考图片") | 1810 | self.status_label.setText(f"● 已通过拖拽添加 {added_count} 张参考图片") |
| 1795 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") | 1811 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") |
| 1812 | |||
| 1813 | # 检查极速模式下的多图限制 | ||
| 1814 | self.check_multi_image_mode_conflict() | ||
| 1796 | else: | 1815 | else: |
| 1797 | self.logger.warning("没有找到有效的拖拽图片文件") | 1816 | self.logger.warning("没有找到有效的拖拽图片文件") |
| 1798 | QMessageBox.warning(self, "警告", "没有找到有效的图片文件") | 1817 | QMessageBox.warning(self, "警告", "没有找到有效的图片文件") |
| ... | @@ -1835,6 +1854,9 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -1835,6 +1854,9 @@ class ImageGeneratorWindow(QMainWindow): |
| 1835 | self.status_label.setText("● 已添加剪贴板图片") | 1854 | self.status_label.setText("● 已添加剪贴板图片") |
| 1836 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") | 1855 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") |
| 1837 | self.logger.info(f"剪贴板图片已成功保存到: {temp_file_path}") | 1856 | self.logger.info(f"剪贴板图片已成功保存到: {temp_file_path}") |
| 1857 | |||
| 1858 | # 检查极速模式下的多图限制 | ||
| 1859 | self.check_multi_image_mode_conflict() | ||
| 1838 | else: | 1860 | else: |
| 1839 | self.logger.error("图片保存失败") | 1861 | self.logger.error("图片保存失败") |
| 1840 | QMessageBox.critical(self, "错误", "无法保存剪贴板图片") | 1862 | QMessageBox.critical(self, "错误", "无法保存剪贴板图片") |
| ... | @@ -2088,6 +2110,63 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -2088,6 +2110,63 @@ class ImageGeneratorWindow(QMainWindow): |
| 2088 | self.status_label.setText("● 已删除提示词") | 2110 | self.status_label.setText("● 已删除提示词") |
| 2089 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") | 2111 | self.status_label.setStyleSheet("QLabel { color: #34C759; }") |
| 2090 | 2112 | ||
| 2113 | def get_selected_model(self): | ||
| 2114 | """根据生成模式返回对应的模型名称""" | ||
| 2115 | if self.generation_mode.currentText() == "慢速模式": | ||
| 2116 | return "gemini-3-pro-image-preview" | ||
| 2117 | else: | ||
| 2118 | return "gemini-2.5-flash-image-preview" | ||
| 2119 | |||
| 2120 | def on_generation_mode_changed(self, index): | ||
| 2121 | """生成模式切换时的处理""" | ||
| 2122 | if self.generation_mode.currentText() == "极速模式": | ||
| 2123 | # 极速模式强制使用1K | ||
| 2124 | self.image_size.setCurrentIndex(0) # 1K | ||
| 2125 | |||
| 2126 | def on_image_size_changed(self, index): | ||
| 2127 | """图片尺寸切换时的处理""" | ||
| 2128 | selected_size = self.image_size.currentText() | ||
| 2129 | current_mode = self.generation_mode.currentText() | ||
| 2130 | |||
| 2131 | # 如果选择2K或4K,且当前是极速模式,提示切换 | ||
| 2132 | if selected_size in ["2K", "4K"] and current_mode == "极速模式": | ||
| 2133 | reply = QMessageBox.question( | ||
| 2134 | self, | ||
| 2135 | "模式切换确认", | ||
| 2136 | f"{selected_size} 只有慢速模式支持,是否确认切换到慢速模式?", | ||
| 2137 | QMessageBox.Yes | QMessageBox.No, | ||
| 2138 | QMessageBox.No | ||
| 2139 | ) | ||
| 2140 | if reply == QMessageBox.Yes: | ||
| 2141 | self.generation_mode.setCurrentIndex(1) # 切换到慢速模式 | ||
| 2142 | else: | ||
| 2143 | # 用户拒绝,恢复到1K | ||
| 2144 | self.image_size.setCurrentIndex(0) | ||
| 2145 | |||
| 2146 | def check_multi_image_mode_conflict(self): | ||
| 2147 | """检查极速模式下的多图限制""" | ||
| 2148 | current_mode = self.generation_mode.currentText() | ||
| 2149 | image_count = len(self.uploaded_images) | ||
| 2150 | |||
| 2151 | # 如果是极速模式且有多张图片,提示切换 | ||
| 2152 | if current_mode == "极速模式" and image_count > 1: | ||
| 2153 | reply = QMessageBox.question( | ||
| 2154 | self, | ||
| 2155 | "模式切换确认", | ||
| 2156 | f"极速模式只支持单张参考图,您已上传 {image_count} 张图片。\n是否切换到慢速模式以使用多图功能?", | ||
| 2157 | QMessageBox.Yes | QMessageBox.No, | ||
| 2158 | QMessageBox.No | ||
| 2159 | ) | ||
| 2160 | if reply == QMessageBox.Yes: | ||
| 2161 | self.generation_mode.setCurrentIndex(1) # 切换到慢速模式 | ||
| 2162 | else: | ||
| 2163 | # 用户拒绝,移除多余的图片,只保留第一张 | ||
| 2164 | self.uploaded_images = self.uploaded_images[:1] | ||
| 2165 | self.update_image_preview() | ||
| 2166 | self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张") | ||
| 2167 | self.status_label.setText("● 已保留第一张参考图片") | ||
| 2168 | self.status_label.setStyleSheet("QLabel { color: #FF9500; }") | ||
| 2169 | |||
| 2091 | def generate_image_async(self): | 2170 | def generate_image_async(self): |
| 2092 | """Submit image generation task to queue""" | 2171 | """Submit image generation task to queue""" |
| 2093 | from task_queue import TaskType | 2172 | from task_queue import TaskType |
| ... | @@ -2108,7 +2187,7 @@ class ImageGeneratorWindow(QMainWindow): | ... | @@ -2108,7 +2187,7 @@ class ImageGeneratorWindow(QMainWindow): |
| 2108 | reference_images=self.uploaded_images.copy(), | 2187 | reference_images=self.uploaded_images.copy(), |
| 2109 | aspect_ratio=self.aspect_ratio.currentText(), | 2188 | aspect_ratio=self.aspect_ratio.currentText(), |
| 2110 | image_size=self.image_size.currentText(), | 2189 | image_size=self.image_size.currentText(), |
| 2111 | model="gemini-3-pro-image-preview", | 2190 | model=self.get_selected_model(), |
| 2112 | user_name=self.authenticated_user, | 2191 | user_name=self.authenticated_user, |
| 2113 | device_name=socket.gethostname() | 2192 | device_name=socket.gethostname() |
| 2114 | ) | 2193 | ) |
| ... | @@ -2702,6 +2781,9 @@ class ImageGenerationWorker(QThread): | ... | @@ -2702,6 +2781,9 @@ class ImageGenerationWorker(QThread): |
| 2702 | self.progress.emit("正在生成图片...") | 2781 | self.progress.emit("正在生成图片...") |
| 2703 | 2782 | ||
| 2704 | # Generation config | 2783 | # Generation config |
| 2784 | # Note: gemini-2.5-flash-image-preview does not support image_size parameter | ||
| 2785 | if "gemini-3-pro-image-preview" in self.model: | ||
| 2786 | # Gemini 3 Pro supports both aspect_ratio and image_size | ||
| 2705 | config = types.GenerateContentConfig( | 2787 | config = types.GenerateContentConfig( |
| 2706 | response_modalities=["IMAGE"], | 2788 | response_modalities=["IMAGE"], |
| 2707 | image_config=types.ImageConfig( | 2789 | image_config=types.ImageConfig( |
| ... | @@ -2709,10 +2791,18 @@ class ImageGenerationWorker(QThread): | ... | @@ -2709,10 +2791,18 @@ class ImageGenerationWorker(QThread): |
| 2709 | image_size=self.image_size | 2791 | image_size=self.image_size |
| 2710 | ) | 2792 | ) |
| 2711 | ) | 2793 | ) |
| 2794 | else: | ||
| 2795 | # Gemini 2.5 Flash only supports aspect_ratio (fixed 1024px output) | ||
| 2796 | config = types.GenerateContentConfig( | ||
| 2797 | response_modalities=["IMAGE"], | ||
| 2798 | image_config=types.ImageConfig( | ||
| 2799 | aspect_ratio=self.aspect_ratio | ||
| 2800 | ) | ||
| 2801 | ) | ||
| 2712 | 2802 | ||
| 2713 | # Generate | 2803 | # Generate |
| 2714 | response = client.models.generate_content( | 2804 | response = client.models.generate_content( |
| 2715 | model="gemini-3-pro-image-preview", | 2805 | model=self.model, |
| 2716 | contents=content_parts, | 2806 | contents=content_parts, |
| 2717 | config=config | 2807 | config=config |
| 2718 | ) | 2808 | ) |
| ... | @@ -3211,6 +3301,19 @@ class StyleDesignerTab(QWidget): | ... | @@ -3211,6 +3301,19 @@ class StyleDesignerTab(QWidget): |
| 3211 | settings_group = QGroupBox("生成设置") | 3301 | settings_group = QGroupBox("生成设置") |
| 3212 | settings_layout = QVBoxLayout() | 3302 | settings_layout = QVBoxLayout() |
| 3213 | 3303 | ||
| 3304 | # 生成模式(放在最前面) | ||
| 3305 | mode_label = QLabel("生成模式") | ||
| 3306 | mode_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") | ||
| 3307 | settings_layout.addWidget(mode_label) | ||
| 3308 | self.generation_mode = QComboBox() | ||
| 3309 | self.generation_mode.addItems(["极速模式", "慢速模式"]) | ||
| 3310 | self.generation_mode.setCurrentIndex(0) # Default to 极速模式 | ||
| 3311 | self.generation_mode.currentIndexChanged.connect(self.on_generation_mode_changed) | ||
| 3312 | settings_layout.addWidget(self.generation_mode) | ||
| 3313 | |||
| 3314 | settings_layout.addSpacing(10) | ||
| 3315 | |||
| 3316 | # 宽高比 | ||
| 3214 | aspect_label = QLabel("宽高比") | 3317 | aspect_label = QLabel("宽高比") |
| 3215 | aspect_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") | 3318 | aspect_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") |
| 3216 | settings_layout.addWidget(aspect_label) | 3319 | settings_layout.addWidget(aspect_label) |
| ... | @@ -3220,12 +3323,14 @@ class StyleDesignerTab(QWidget): | ... | @@ -3220,12 +3323,14 @@ class StyleDesignerTab(QWidget): |
| 3220 | 3323 | ||
| 3221 | settings_layout.addSpacing(10) | 3324 | settings_layout.addSpacing(10) |
| 3222 | 3325 | ||
| 3326 | # 图片尺寸 | ||
| 3223 | size_label = QLabel("图片尺寸") | 3327 | size_label = QLabel("图片尺寸") |
| 3224 | size_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") | 3328 | size_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") |
| 3225 | settings_layout.addWidget(size_label) | 3329 | settings_layout.addWidget(size_label) |
| 3226 | self.image_size = QComboBox() | 3330 | self.image_size = QComboBox() |
| 3227 | self.image_size.addItems(["1K", "2K", "4K"]) | 3331 | self.image_size.addItems(["1K", "2K", "4K"]) |
| 3228 | self.image_size.setCurrentIndex(1) | 3332 | self.image_size.setCurrentIndex(0) # Default to 1K for 极速模式 |
| 3333 | self.image_size.currentIndexChanged.connect(self.on_image_size_changed) | ||
| 3229 | settings_layout.addWidget(self.image_size) | 3334 | settings_layout.addWidget(self.image_size) |
| 3230 | 3335 | ||
| 3231 | settings_layout.addSpacing(10) | 3336 | settings_layout.addSpacing(10) |
| ... | @@ -3503,6 +3608,39 @@ class StyleDesignerTab(QWidget): | ... | @@ -3503,6 +3608,39 @@ class StyleDesignerTab(QWidget): |
| 3503 | button.setText("🔒") | 3608 | button.setText("🔒") |
| 3504 | button.setToolTip("字段已锁定") | 3609 | button.setToolTip("字段已锁定") |
| 3505 | 3610 | ||
| 3611 | def get_selected_model(self): | ||
| 3612 | """根据生成模式返回对应的模型名称""" | ||
| 3613 | if self.generation_mode.currentText() == "慢速模式": | ||
| 3614 | return "gemini-3-pro-image-preview" | ||
| 3615 | else: | ||
| 3616 | return "gemini-2.5-flash-image-preview" | ||
| 3617 | |||
| 3618 | def on_generation_mode_changed(self, index): | ||
| 3619 | """生成模式切换时的处理""" | ||
| 3620 | if self.generation_mode.currentText() == "极速模式": | ||
| 3621 | # 极速模式强制使用1K | ||
| 3622 | self.image_size.setCurrentIndex(0) # 1K | ||
| 3623 | |||
| 3624 | def on_image_size_changed(self, index): | ||
| 3625 | """图片尺寸切换时的处理""" | ||
| 3626 | selected_size = self.image_size.currentText() | ||
| 3627 | current_mode = self.generation_mode.currentText() | ||
| 3628 | |||
| 3629 | # 如果选择2K或4K,且当前是极速模式,提示切换 | ||
| 3630 | if selected_size in ["2K", "4K"] and current_mode == "极速模式": | ||
| 3631 | reply = QMessageBox.question( | ||
| 3632 | self, | ||
| 3633 | "模式切换确认", | ||
| 3634 | f"{selected_size} 只有慢速模式支持,是否确认切换到慢速模式?", | ||
| 3635 | QMessageBox.Yes | QMessageBox.No, | ||
| 3636 | QMessageBox.No | ||
| 3637 | ) | ||
| 3638 | if reply == QMessageBox.Yes: | ||
| 3639 | self.generation_mode.setCurrentIndex(1) # 切换到慢速模式 | ||
| 3640 | else: | ||
| 3641 | # 用户拒绝,恢复到1K | ||
| 3642 | self.image_size.setCurrentIndex(0) | ||
| 3643 | |||
| 3506 | def generate_image(self): | 3644 | def generate_image(self): |
| 3507 | """Submit image generation task to queue""" | 3645 | """Submit image generation task to queue""" |
| 3508 | from task_queue import TaskType | 3646 | from task_queue import TaskType |
| ... | @@ -3516,7 +3654,7 @@ class StyleDesignerTab(QWidget): | ... | @@ -3516,7 +3654,7 @@ class StyleDesignerTab(QWidget): |
| 3516 | # 获取设置 | 3654 | # 获取设置 |
| 3517 | aspect_ratio = self.aspect_ratio.currentText() | 3655 | aspect_ratio = self.aspect_ratio.currentText() |
| 3518 | image_size = self.image_size.currentText() | 3656 | image_size = self.image_size.currentText() |
| 3519 | model = "gemini-3-pro-image-preview" | 3657 | model = self.get_selected_model() |
| 3520 | 3658 | ||
| 3521 | # 获取父窗口的 API key | 3659 | # 获取父窗口的 API key |
| 3522 | if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key: | 3660 | if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key: |
| ... | @@ -3620,7 +3758,7 @@ class StyleDesignerTab(QWidget): | ... | @@ -3620,7 +3758,7 @@ class StyleDesignerTab(QWidget): |
| 3620 | reference_images=[], # 款式设计无参考图 | 3758 | reference_images=[], # 款式设计无参考图 |
| 3621 | aspect_ratio=self.aspect_ratio.currentText(), | 3759 | aspect_ratio=self.aspect_ratio.currentText(), |
| 3622 | image_size=self.image_size.currentText(), | 3760 | image_size=self.image_size.currentText(), |
| 3623 | model="gemini-3-pro-image-preview" | 3761 | model=self.get_selected_model() |
| 3624 | ) | 3762 | ) |
| 3625 | self.logger.info(f"款式设计已添加到历史记录: {timestamp}") | 3763 | self.logger.info(f"款式设计已添加到历史记录: {timestamp}") |
| 3626 | 3764 | ... | ... |
-
Please register or sign in to post a comment