UI控件-> ListView(2)

package	javafxui;

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class LearnUI extends Application {

    ListView<String> list = new ListView<>();
    ObservableList<String> data = FXCollections.observableArrayList(
            "chocolate", "salmon", "gold", "coral", "darkorchid",
            "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue",
            "blueviolet", "brown");
    final Label label = new Label();

    @Override
    public void start(Stage stage) {
        VBox box = new VBox();
        Scene scene = new Scene(box, 200, 200);
        stage.setScene(scene);
        stage.setTitle("ListViewSample");
        box.getChildren().addAll(list, label);
        VBox.setVgrow(list, Priority.ALWAYS);//垂直适应窗口大小

        label.setLayoutX(10);
        label.setLayoutY(115);
        label.setFont(Font.font("Verdana", 20));

        list.setItems(data);

        list.setCellFactory((ListView<String> l) -> new ColorRectCell());

        //为选中的list Item 显示对应颜色的 文本
        list.getSelectionModel().selectedItemProperty().addListener(
                (ObservableValue<? extends String> ov, String old_val,
                        String new_val) -> {
                    label.setText(new_val);
                    label.setTextFill(Color.web(new_val));
                });
        	stage.show();
    }

    static class ColorRectCell extends ListCell<String> {

    	//item 就是指ListView  中的item 元素
        @Override
        public void updateItem(String item, boolean empty) {
        	super.updateItem(item, empty);
        	Rectangle rectangle = new Rectangle(100, 20);
        	if(item != null) {
        		rectangle.setFill(Color.web(item));
        		setGraphic(rectangle);
        	}
        	else {
        		setGraphic(null);
        	}
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

### 设置 QComboBox 的视图为 QListView 在 Qt 中,`QComboBox` 提供了一个 `setView(QAbstractItemView *view)` 方法来设置其内部使用的视图对象。通过该方法可以将默认的视图替换为自定义的视图,比如 `QListView`。 以下是关于如何在 Qt 中设置 `QComboBox` 的视图为 `QListView` 的详细说明和示例代码: #### 使用场景描述 当需要更改 `QComboBox` 默认下拉列表的行为或外观时,可以通过将其视图更改为 `QListView` 来实现更多定制化功能。例如,调整项的高度、宽度或者启用滚动条等特性[^1]。 #### 示例代码展示 下面是一个完整的 C++ 示例程序,演示了如何创建一个带有自定义 `QListView` 的 `QComboBox` 并对其进行配置: ```cpp #include <QApplication> #include <QComboBox> #include <QStringList> #include <QVBoxLayout> #include <QWidget> #include <QListView> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口部件 QWidget window; QVBoxLayout layout(&window); // 初始化组合框并填充数据 QComboBox comboBox; QStringList items = {"苹果", "香蕉", "橙子"}; comboBox.insertItems(0, items); // 创建一个新的 QListView 实例作为新的视图组件 QListView* listView = new QListView(); listView->setUniformItemSizes(true); // 启用统一大小模式以提高性能 // 将新创建的 QListView 应用于 QComboBox comboBox.setView(listView); // 添加到布局中以便显示出来 layout.addWidget(&comboBox); window.resize(300, 200); window.show(); return app.exec(); } ``` 上述代码片段展示了如何实例化 `QListView` 对象并通过调用 `setView()` 函数将其分配给 `QComboBox` 控件。此外还设置了某些属性 (如 uniform item sizes),这有助于优化渲染过程中的效率[^2]。 #### 关键点解析 - **QListView 配置**: 可以为 `QListView` 调整各种参数,例如网格尺寸 (`gridSize`) 或者滑动行为 (`scrollMode`)- **性能考虑**: 如果预期会有大量条目,则建议开启 `uniformItemSizes` 属性,这样可以让模型假设所有行具有相同高度从而减少重新计算的工作量。 #### 结论 通过以上方式能够灵活改变标准控件的表现形式满足特定需求的同时保持良好的用户体验效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值