2016-08-15 42 views
0

我创建了QWidget的这样一个非常简单的子类:QWidget中的一个简单的子类不作为一个QWidget工作

class WorldView : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit WorldView(QWidget *parent = 0); 

signals: 

public slots: 
}; 

WorldView::WorldView(QWidget *parent) : QWidget(parent) 
{ 

} 

我在创建主窗口中它的实例是这样的:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

protected: 
    virtual void resizeEvent(QResizeEvent* event) override; 

private: 
    WorldView* _worldView; 
}; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    _worldView = new WorldView(this); 
    _worldView->setStyleSheet(QString("* {background-color : black}")); 
} 

MainWindow::~MainWindow() 
{ 
    delete _worldView; 
} 

void MainWindow::resizeEvent(QResizeEvent *event) 
{ 
    _worldView->resize(size()); 
} 

但是小部件并未按预期显示。

我曾尝试致电show(),但它仍未显示。

奇怪的是,当我用QWidget代替WorldView时,小部件显示。

我不知道为什么。

+0

忘了setupUI的世界观? – FreddyKay

+0

@FreddyKay没有UI文件。所以不需要setupUI。 – crupest

+0

你对'_worldView-> resize(size())的期望是什么?'size()'返回(或被抛弃)的是什么? – mvidelgauz

回答

2

由于样式表不适用于自定义QWidget子类。

https://doc.qt.io/qt-5/stylesheet-reference.html

QWidget的

仅支持的背景下,背景剪辑和背景来源的性质。

如果从QWidget的子类,你需要为你定制的QWidget提供的paintEvent如下:

void CustomWidget::paintEvent(QPaintEvent *) 
{ 
    QStyleOption opt; 
    opt.init(this); 
    QPainter p(this); 
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); 
} 

上面的代码是一个空操作,如果没有样式表集。

警告:确保您为自定义小部件定义了Q_OBJECT宏。

(而且,一般来讲,停止使用样式表)。

+0

为什么“停止使用样式表”? –

+1

他们昂贵,越野车和无人维护;基本上是一种制止缺口和快速的自定义外观和感觉的方式。获得非本地外观的唯​​一完整方法是继承QStyle。此外,人们倾向于滥用它们,甚至获得一些基本效果(例如更改背景颜色或类似,通过更改小部件的调色板或通过自定义绘画事件可以更便宜地获得这些效果)。 – peppe

+0

嗯,我明白了。虽然我曾尝试通过安装代理样式(我尝试在“CustomTableView:public QTableView”类中安装)来尝试更改QTableView的外观,但它不起作用,我放弃了。国际海事组织关于如何通过继承QStyle来定制风格只有很少的文档。 –

相关问题